为什么logcat会出现报错

为什么logcat会出现报错


130|console:/ # logcat -c;logcat -G 100M;logcat >/data/1.txt &       
[1] 6787
console:/ # 
console:/ # logcat -g
main: ring buffer is 100 MiB (15 KiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 100 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 100 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
perf: ring buffer is 100 MiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 100 MiB (15 KiB consumed), max entry is 5120 B, max payload is 4068 B
console:/ # logcat: Unexpected EOF!

This means that either the device shut down, logd crashed, or this instance of logcat was unable to read log
messages as quickly as they were being produced.

If you have enabled significant logging, look into using the -G option to increase log buffer sizes.
^C
[1] + Done (1)             \logcat >/data/1.txt 
130|console:/ # ls -alt /data/1.txt                                            
-rw------- 1 root root 1052349 2023-05-29 04:26 /data/1.txt
console:/ # du -h /data/1.txt                                                  
1.0M    /data/1.txt

logcat报错的原因是无法读取日志消息的速度跟不上其生成的速度,有几个可能的原因:
1、设备关闭或重启导致 logd 停止工作。
2、logd 宕机。
3、该 logcat 实例无法快速读取日志消息。
如已经启用大量日志记录,尝试使用 -G 选项增加日志缓冲区大小。
通过运行以下命令获取当前存储器概览:df -h。

logcat出现报错的原因可能有以下几种:

  1. 设备关机或重启,导致logcat读取不到日志信息。

  2. logd进程崩溃,导致logcat无法读取日志信息。

  3. logcat读取速度跟不上日志产生速度,导致出现Unexpected EOF!错误。

  4. 日志缓冲区大小不足,可以使用-G选项增加缓冲区大小。

针对你提供的logcat信息,可能是由于logcat读取速度跟不上日志产生速度,导致出现Unexpected EOF!错误。你可以尝试使用-G选项增加缓冲区大小,或者减少日志产生速度,以解决该问题。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7761432
  • 你也可以参考下这篇文章:Logcat使用
  • 除此之外, 这篇博客: Android日志通过logcat实时输出至文件中的 二、利用logcat系统方法将日志输出到文件中 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 核心代码

    /**
         * 开始收集日志信息
         */
        public static void createLogCollector(String path) {
            if (path == null) {
                Log.d("LogUtils", "未设置path");
                return;
            }
            new Thread(){
                @Override
                public void run() {
                    super.run();
                    try {
                        String cmdCollect = path + logFileDate.format(Calendar.getInstance().getTime()) + ".txt";
                        try {
                            List<String> commandList = new ArrayList<>();
                            commandList.add("logcat");
                            commandList.add("-f");
                            commandList.add(cmdCollect);
                            commandList.add("-v");
                            commandList.add("time");
                            commandList.add(TAG + ":I");
    
                            commandList.add("System.err:W");// 过滤所有的错误信息
                            commandList.add("System.out:I");// 过滤所有的错误信息
                            commandList.add("AndroidRuntime:E"); //运行报错
    
                            // 过滤指定TAG的信息
                            commandList.add(TAG + ":V");
                            commandList.add(TAG + ":D");
                            commandList.add("*:S");
                            try {
                                Process process = Runtime.getRuntime().exec(commandList.toArray(new String[commandList.size()]));
                                Thread.sleep(1000);
                            } catch (Exception e) {
                                Log.e(TAG, "CollectorThread == >" + e.getMessage(), e);
                            }
                        } catch (Exception ex) {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }catch (Exception ex){
                        Log.d(TAG , ex.getMessage());
                    }
                    Log.d(TAG ,"收集日志循环已完全启动!!!");
                }
            }.start();
        }
    

    以上代码实际上就相当于执行了系统的logcat方法,其中的主要参数有输出文件路径、已经过滤需要输出到文件中的TAG。
    注:系统会依据是否能够写入然后写入文件中,如果无存储权限的话,则不会输出文件,执行一次过后才开始写入文件。

    外部调用方式:

    static{
    	 if (BuildConfig.DEBUG) {
    	         LogUtils.TAG = "com.test";
    	         LogUtils.createLogCollector(FileConstants.VA_LOG_PATH);
    	 } 
     }
    

    博主调用方式是写在Application静态代码块中,一次执行即可。
    源码地址(提取码: rk53)。