如何使用命令行中的 logcat 通过 TAG 排除消息?

问题描述

我正在以编程方式流式传输 logcat 输出,并且我想排除带有某些标签的日志。这是未经过滤的版本(有效):

Runtime.getRuntime().exec("logcat -v time");

这个用例在 Android Studio 中使用“Log Tag:”输入框是可能的,所以在命令行中也应该是可能的。

根据文档,您可以使用正则表达式过滤日志。与在标签上明确过滤并不完全相同,但我想它会这样做:

-e,--regex=

仅打印日志消息与正则表达式匹配的行。

来源:https://developer.android.com/studio/command-line/logcat.html?hl=en#options)

我不能让它工作。例如,我尝试过使用否定前瞻(“包括不包含这些关键字的所有内容”):

Runtime.getRuntime().exec("logcat -v time -e ^(?!.*(ConnectionTracker|SensorManager|SurfaceControl|TetheringManager|ThemeUtils|TransportRuntime|Openglrenderer|ViewRoot))");

...但它不起作用。

有效但超级丑:

  class LogToFileRunnable implements Runnable {

        @Override
        public void run() {
            try {
                final Runtime runtime = Runtime.getRuntime();
                final Process process = runtime.exec("logcat -v time");
                final BufferedReader bufferedReader = new BufferedReader(
                        new InputStreamReader(process.getInputStream(),Charsets.UTF_8));

                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    if (!containsExcludedTags(line)) {
                        logFile.writeLog(String.format(Locale.ROOT,"%d-%s%n",CURRENT_YEAR,line));
                    }
                }
            } catch (IOException e) {
                throw new LoggerException("Unable to write log to file.",e);
            }
        }

        private boolean containsExcludedTags(@NonNull String line) {
            return line.contains("/mali_winsys(") || line.contains("/mali::instrumentation::perfetto::frequency(") ||
                    line.contains("/AbsListView(") || line.contains("/ConnectionTracker(") ||
                    line.contains("/DecorView(") || line.contains("/FA ") || line.contains("/InputMethodManager(") ||
                    line.contains("/mali_egl(") || line.contains("/libEGL ") || line.contains("/DatabaseUtils(") ||
                    line.contains("/InputTransport(") || line.contains("/MixpanelAPI(") ||
                    line.contains("/SensorManager(") || line.contains("/SurfaceControl(") ||
                    line.contains("/System.out(") || line.contains("/TetheringManager(") ||
                    line.contains("/ThemeUtils(") || line.contains("/TransportRuntime(") ||
                    line.contains("/Openglrenderer(") || line.contains("/ViewRootImpl");
        }

    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)