Android: фильтр Logcat по тегу с помощью регулярных выражений - PullRequest
6 голосов
/ 20 марта 2012

При регистрации мои теги всегда выглядят так:

com.myapp.SomeActivity

Для каждого оператора журнала я добавляю первую часть «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);
 }
}

Поэтому все, что я делаю, это добавляю статический тег к тегу класса.Причина в том, что я хочу отфильтровать вывод logcat по операторам Log, которые пишет мое приложение, и чтобы не загромождать мой лог-файл журналами из системы или других приложений.

Поэтому я пришел к получению таких журналов, как это:

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 я могу проверить, содержит ли строка мой тег, и добавить его только в этом случае, но я бы действительно хотел избежатьчто ... * * 1023

1 Ответ

2 голосов
/ 21 марта 2012

Хорошо, чтобы решить проблему, я отказался от более элегантного (и до сих пор неизвестного) решения для Плана Б, о котором я говорил в своем первом посте. Я использую следующее регулярное выражение для фильтрации каждой строки файла журнала, полученного с помощью команды logcat -d -v time *: I (выполняется с помощью Runtime.getRuntime (). Exec (команда)):

.*([DIWE]{1}/com.myapp.).*

Вышеупомянутое регулярное выражение соответствует операторам журнала следующим образом:

I/com.myapp.MyClass Crashed and did not recover - too bad.

[DEWI] означает, что уровень логирования должен быть D (ebug), E (rror), W (arning) или I (nfo), чтобы регулярное выражение совпадало. Если вы также хотите извлечь V (erbose) протоколирование, просто добавьте «V».

...