Androidデバイスからログファイルを取得するにはどうすればよいですか?


129

デバイスからPCにログファイルをプルしたいのですが。どうやってやるの?

回答:


112

Logcollectorは適切なオプションですが、最初にインストールする必要があります。

メールで送信するログファイルを取得したいときは、通常次のようにします。


このコマンドラインは私には機能しません。この出力が表示されます。logcatの読み取り:無効な引数
neoneye

5
4.1以降のバージョンのandroidではlogcollectorが機能しないことに注意してください。これは、アプリケーションが独自のログエントリの読み取りのみを許可されているためです。(groups.google.com/forum/#!topic/android-log-collector/...
マシューロウ

11
単純な方法はありませんか?adbなどをインストールする必要なしに、外部ストレージデバイスとしてUSB経由で接続されたログファイルをデバイスから単にプルする方法はありますか?
またはMapper 2015

を実行する適切なディレクトリにいることを確認してくださいadb。通常はC:\Users\[your username]\AppData\Local\Android\Sdk\platform-tools\
lolololol ol

30

このコードが誰かを助けることを願っています。デバイスからログを記録し、それをフィルタリングする方法を見つけるのに2日かかりました:

public File extractLogToFileAndWeb(){
        //set a file
        Date datum = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALY);
        String fullName = df.format(datum)+"appLog.log";
        File file = new File (Environment.getExternalStorageDirectory(), fullName);

        //clears a file
        if(file.exists()){
            file.delete();
        }


        //write log to file
        int pid = android.os.Process.myPid();
        try {
            String command = String.format("logcat -d -v threadtime *:*");        
            Process process = Runtime.getRuntime().exec(command);

            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuilder result = new StringBuilder();
            String currentLine = null;

            while ((currentLine = reader.readLine()) != null) {
                   if (currentLine != null && currentLine.contains(String.valueOf(pid))) {
                       result.append(currentLine);
                       result.append("\n");
                    }
            }

            FileWriter out = new FileWriter(file);
            out.write(result.toString());
            out.close();

            //Runtime.getRuntime().exec("logcat -d -v time -f "+file.getAbsolutePath());
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }


        //clear the log
        try {
            Runtime.getRuntime().exec("logcat -c");
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
        }

        return file;
    }

@mehdokが指摘するように

ログを読み取るための権限をマニフェストに追加する

<uses-permission android:name="android.permission.READ_LOGS" />

1
これは問題なく機能しますが、必要なすべてのデバイスで機能します<uses-permission android:name="android.permission.READ_LOGS" />
mehdok

27

私はこのようなものを使用します:

$adb logcat -d > logcat.txt

-dオプションは、循環バッファー全体をテキストファイルにダンプします。特定のアクション/インテントを探している場合は、

$adb logcat -d | grep 'com.whatever.you.are.looking.for' -B 100 -A 100 > shorterlog.txt

お役に立てれば :)


13

USBのデバッグや使用adbに興味がない場合は、より簡単な解決策があります。Android 6(以前のバージョンについては不明)には、開発者ツールの下にオプションがあります:バグレポートを取得

このオプションをクリックすると、バグレポートが準備され、ドライブに保存するか、電子メールで送信するように求められます。

これがログを取得する最も簡単な方法であることがわかりました。USBデバッグをオンにしたくない。


1
まさに私が探していたもの!
YYamil 2016

1
正確にどこにありますか?
gurehbgui 2017

11

編集:

内部ログはメモリ内の循環バッファです。実際には、ラジオ、イベント、メインのそれぞれに、このような循環バッファーがいくつかあります。デフォルトはmainです。

バッファのコピーを取得するには、デバイスでコマンドを実行し、出力を文字列変数として取得する方法が1つあります。

SendLogはこれを行うオープンソースのアプリです:http ://www.l6n.org/android/sendlog.shtml

重要なのはlogcat、組み込みOSのデバイスで実行することです。それほど難しくはありません。リンクからオープンソースアプリをチェックしてください。


これは出力を画面にダンプします。ファイルに必要です。
Pentium10 2010年

aLogCatでログを送信できます。または単にDDMSからコピーして貼り付けます:P
molnarm

@molnarm彼がする必要があるすべてのことであるならば、私の答えは少し過剰に設計されたと認めます=)
Brad Hein

@BradHein SendLogはオープンソースだとおっしゃいましたが、ソースコードが見つかりません。それがどこにあるのか?
smith324 2012年

8

多くの場合、エラー「logcat read: Invalid argument」が発生します。ログから読み取る前に、ログをクリアする必要がありました。

私はこれが好きです:

prompt> cd ~/Desktop
prompt> adb logcat -c
prompt> adb logcat | tee log.txt

ありがとう!私は長い間そのエラーを抱えていましたが、そのlogcat -cはすぐに修正しました!
ジョーズ、2012年

4

簡単な方法は、独自のログコレクターメソッドを作成するか、市場から既存のログコレクターアプリを作成することです。

私のアプリでは、ログを自分の電子メール(または別の場所)に送信するレポート機能を作成しました。ログを取得すると、それを使用するかどうかを確認できます。

次に、デバイスからログファイルを取得する簡単な例を示します。



3

古い質問であることは承知していますが、2018年でもまだ有効だと思います。

すべてのAndroidデバイスの開発者向けオプションに隠されているバグレポート取得するオプションがあります。

注:これはシステムログ全体をダンプします

開発者向けオプションを有効にする方法は?参照:https : //developer.android.com/studio/debug/dev-options

私のために働くもの:

  1. デバイスを再起動します(開発者が分析できる最小限のガベージログを作成するため)。
  2. バグを再現する
  3. [設定]-> [開発者向けオプション]-> [バグレポートを取得]に移動します
  4. Androidシステムがログを収集するのを待ちます(通知のプログレスバーを確認します)
  5. 完了したら、通知をタップして共有します(Gmailまたはwheteverを使用できます)

これをどう読むか?バグレポートを開く-1960-01-01-hh-mm-ss.txt

あなたはおそらくこのようなものを探したいでしょう:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of crash
06-13 14:37:36.542 19294 19294 E AndroidRuntime: FATAL EXCEPTION: main

または:

------ SYSTEM LOG (logcat -v threadtime -v printable -d *:v) ------
--------- beginning of main

2

user1354692のおかげで、1行だけでもっと簡単にできました。彼がコメントしたもの:

try {
    File file = new File(Environment.getExternalStorageDirectory(), String.valueOf(System.currentTimeMillis()));
    Runtime.getRuntime().exec("logcat -d -v time -f " + file.getAbsolutePath());}catch (IOException e){}

このコードを配置するのに最適な場所はどこですか?でOnCreate
Youngjae 2014年

2

電子メールでログを取得するための小さなライブラリ(.aar)を作成しました。Gmailアカウントで使用できます。それはかなりシンプルですが動作します。ここからコピー取得できます

サイトはスペイン語ですが、製品の説明の英語版のPDFがあります。

お役に立てれば幸いです。


2

2つのステップ:

  • ログを生成する
  • Gmailを読み込んでログを送信します

  1. ログを生成する

    File generateLog() {
        File logFolder = new File(Environment.getExternalStorageDirectory(), "MyFolder");
        if (!logFolder.exists()) {
            logFolder.mkdir();
        }
        String filename = "myapp_log_" + new Date().getTime() + ".log";
    
        File logFile = new File(logFolder, filename);
    
        try {
            String[] cmd = new String[] { "logcat", "-f", logFile.getAbsolutePath(), "-v", "time", "ActivityManager:W", "myapp:D" };
            Runtime.getRuntime().exec(cmd);
            Toaster.shortDebug("Log generated to: " + filename);
            return logFile;
        }
        catch (IOException ioEx) {
            ioEx.printStackTrace();
        }
    
        return null;
    }
  2. Gmailを読み込んでログを送信します

    File logFile = generateLog();
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(logFile));
    intent.setType("multipart/");
    startActivity(intent);

#1のリファレンス

~~

#2の場合-ログファイルを読み込んで表示および送信する方法については、さまざまな答えがあります。最後に、ここでのソリューションは実際に両方に機能しました:

  • オプションとしてGmailを読み込む
  • ファイルを正常に添付します

正しく機能する回答を提供してくれたhttps://stackoverflow.com/a/22367055/2162226に感謝


0

まず、PATHをandroid sdk platform-toolsに設定して、adbコマンドが実行可能であることを確認します。

export PATH=/Users/espireinfolabs/Desktop/soft/android-sdk-mac_x86/platform-tools:$PATH

次に実行します:

adb shell logcat > log.txt

または、最初にadb platform-toolsに移動します。

cd /Users/user/Android/Tools/android-sdk-macosx/platform-tools 

次に実行します

./adb shell logcat > log.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.