当记录我的标签时,总是这样:
com.myapp.SomeActivity
对于每一条日志语句,我都会在进行日志调用的类的Tag前面加上第一部分"com.myapp."。例如:
MyActivity extends Activity{
private static final String TAG = "MyActivity";
public void someMethod(){
LogWrapper.e(TAG, "Something is wrong here.");
}
}
我的类LogWrapper基本上完成以下
public class LogWrapper {
private static final String applicationTAG = "com.myapp.";
public static void e(String classTag, String message){
Log.e(applicationTAG + classTag, message);
}
}
所以我所做的就是在类的标记前面加一个静态标记。原因是,我想通过我的应用程序编写的Log语句来过滤logcat输出,并避免将我的日志文件与系统或其他应用程序的日志混淆。
因此,我想出了获得这样的日志:
String command = "logcat -d -v time com.myapp.*:I *:S"
Process process = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
StringBuilder log = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
log.append(line);
log.append(StringUtils.NEW_LINE);
}
然而,我最终得到了一个空的日志文件。这让我觉得正则表达式"com.myapp.:I"不起作用。我也试着省略星号(),但都不起作用。但是,如果我使用"*:I",则有效。
这让我想知道,是否只能通过一个完整的标签名称进行过滤?有没有一种方法可以让我获得一个经过"com.myapp"过滤的日志?
我想B计划是在while循环中,我可以检查行是否包含我的标记,并仅在这种情况下附加它,但我真的想避免这种情况。。。
好的,为了解决这个问题,我放弃了我在第一篇文章中暗示的B计划的更优雅(但仍然未知)的解决方案。我使用以下正则表达式来过滤我使用命令logcat-d-v time*获得的日志文件的每一行:I(使用Runtime.getRuntime().exc(命令)执行):
.*([DIWE]{1}/com.myapp.).*
上面的正则表达式匹配如下日志语句:
I/com.myapp.MyClass Crashed and did not recover - too bad.
[DEWI]意味着,日志级别必须是D(ebug)、E(error)、W(arning)或I(nfo),正则表达式才能匹配。如果您也想提取V(erbose)日志记录,只需添加一个"V"即可。