如何从Android设备获取日志文件?

146

我想从设备上提取日志文件到我的电脑。如何操作?

14个回答

124

这个命令行对我不起作用,我得到了这个输出。logcat读取:无效参数。 - neoneye
5
请注意,日志收集器在 Android 4.1 及以上版本中无法工作,因为应用程序现在只允许读取自己的日志条目。(来源:https://groups.google.com/forum/#!topic/android-log-collector/vgYXYbg-O1U) - Matthew Lowe
12
有没有一种简单的方法,可以在设备通过 USB 作为外部存储设备连接后,不需要安装 adb 或其他任何工具,就能简单地从设备中提取日志文件呢? - O. R. Mapper
确保你在正确的目录下运行 adb。通常在 C:\Users\[你的用户名]\AppData\Local\Android\Sdk\platform-tools\ - lolololol ol

34

我希望这段代码能够帮助到别人。花了我两天时间才搞清楚如何从设备中记录日志并进行过滤:

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

31

我会使用类似下面这样的东西:

$adb logcat -d > logcat.txt

-d选项将整个循环缓冲区转储到文本文件中,如果您正在寻找特定的操作/意图,请尝试

$adb logcat -d | grep 'com.whatever.you.are.looking.for' -B 100 -A 100 > shorterlog.txt
希望这可以帮到你 :)

15

对于那些不感兴趣使用 USB 调试或者使用 adb 的人来说,有一种更简单的解决方案。在 Android 6 中(之前的版本不确定),在开发者选项中有一个选项:Take Bug Report。

点击此选项会准备一个 bug 报告,并提示您将其保存到驱动器或通过电子邮件发送。

我发现这是获取日志最简单的方法。我不喜欢开启 USB 调试。


1
正是我所寻找的! - YYamil
1
我应该在哪里准确地找到它? - gurehbgui

11

编辑:

内部日志是内存中的循环缓冲区。实际上,每个缓冲区都有几个这样的循环缓冲区,分别为:无线电、事件、主要。默认为主要。

获取缓冲区副本的一种技术是在设备上执行命令并将输出作为字符串变量获取。

SendLog是一个开源应用程序,就是做这个的:http://www.l6n.org/android/sendlog.shtml

关键是在嵌入式操作系统中在设备上运行logcat。这并不难,只需查看链接中的开源应用即可。


这会将输出转储到屏幕上,我需要它在一个文件中。 - Pentium10
你可以使用aLogCat来发送日志。或者简单地从DDMS复制粘贴 :P - molnarm
@molnarm 我承认我的答案有点过于工程化,如果这是他需要做的所有事情,那就没必要了 =) - Brad Hein
@BradHein 你说SendLog是开源的,但我似乎找不到源代码。你知道它在哪里吗? - smith324

8
经常出现错误提示 "logcat read: Invalid argument"。在读取日志之前,我必须先清除日志。

我的做法如下:

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

谢谢!我长时间遇到了那个错误,但是logcat -c 立刻解决了它! - Jords

6

我知道这是一个老问题,但我相信即使在2018年,它仍然有效。

每个Android设备中的开发人员选项中都隐藏了一个选项获取错误报告

注意:这将转储整个系统日志。

如何启用开发人员选项?请参见:https://developer.android.com/studio/debug/dev-options

以下是适用于我的方法:

  1. 重新启动设备(以创建最少的垃圾日志供开发人员分析)
  2. 重现您的错误
  3. 转到"设置"-> "开发人员选项"-> "获取错误报告"
  4. 等待Android系统收集日志(观察通知中的进度条)
  5. 完成后,点击通知进行共享(可以使用Gmail或其他邮件应用)

如何查看它? 打开bugreport-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

4
一个简单的方法是制作您自己的日志收集器方法,甚至只需要从市场上获取一个现有的日志收集器应用程序。
对于我的应用程序,我制作了一个报告功能,将日志发送到我的电子邮件(或者甚至发送到其他地方 - 一旦您获得了日志,您可以随心所欲地处理它)。
这里是一个简单的示例,说明如何从设备获取日志文件:

3

只需运行以下命令即可在终端获得输出:

adb shell logcat

3

两步操作:

  • 生成日志
  • 加载Gmail发送日志

.

  1. Generate the log

    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. Load Gmail to send the log

    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://dev59.com/nm025IYBdhLWcg3wAxB9#22367055提供正确可行的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接