问题描述
我正在以编程方式流式传输 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 (将#修改为@)