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

时间:2010-05-21 13:04:53

标签: android

我想将日志文件从设备拉到我的电脑上。我怎么能这样做?

13 个答案:

答案 0 :(得分:105)

Logcollector是个不错的选择,但您需要先安装它。

当我想通过邮件发送日志文件时,我通常会执行以下操作:

答案 1 :(得分:28)

我希望这段代码可以帮助别人。我花了两天时间弄清楚如何从设备登录,然后过滤它:

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" />

答案 2 :(得分:24)

我会使用这种东西:

$adb logcat -d > logcat.txt

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

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

希望这会有所帮助:)

答案 3 :(得分:12)

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

单击此选项将准备错误报告,并提示您将其保存到驱动器或通过电子邮件发送。

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

答案 4 :(得分:10)

编辑:

内部日志是内存中的循环缓冲区。实际上每个都有一些这样的循环缓冲区:radio,events,main。默认值为main。

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

SendLog是一个开源应用程序,可以做到这一点:http://www.l6n.org/android/sendlog.shtml

关键是在嵌入式操作系统中的设备上运行logcat。它并不像听起来那么难,只需查看链接中的开源应用程序即可。

答案 5 :(得分:8)

我经常收到错误“logcat read: Invalid argument”。在阅读日志之前,我必须清除日志。

我喜欢这个:

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

答案 6 :(得分:4)

一种简单的方法是制作您自己的日志收集器方法,甚至只是市场上现有的日志收集器应用程序。

对于我的应用程序,我制作了一个报告功能,可以将日志发送到我的电子邮件(甚至发送到其他地方 - 一旦你获得了日志,你可以随意使用它。)

以下是有关如何从设备获取日志文件的简单示例:

答案 7 :(得分:3)

简单地运行以下命令将输出发送到终端:

adb shell logcat

答案 8 :(得分:3)

我知道这是一个老问题,但我相信即使在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

答案 9 :(得分:2)

感谢用户1354692我只用了一行就能让它变得更简单!他评论过的那个:

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

答案 10 :(得分:2)

我创建了一个小型库(.aar)来通过电子邮件检索日志。您可以将其与Gmail帐户一起使用。这很简单但很有效。您可以获得副本from here

该网站使用西班牙语,但有一份PDF格式的产品说明英文版。

我希望它可以提供帮助。

答案 11 :(得分: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);
    
  3.   

    #1

    的参考文献      

    ~~

      

    对于#2 - 有很多不同的答案,有关如何加载日志文件以查看和发送。最后,这里的解决方案实际上同时适用于:

         
        
    • 将Gmail作为选项加载
    •   
    • 成功附加文件
    •   
         

    非常感谢https://stackoverflow.com/a/22367055/2162226正确运作的答案

答案 12 :(得分:0)

首先确保adb命令可执行,方法是将PATH设置为android sdk platform-tools:

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