Ведение журнала Android: фильтр из самого приложения

Есть ли способ программно настроить приложение Android для фильтрации сообщений журнала, отправляемых в logcat? Я понимаю, что logcat можно настроить для фильтрации вещей, но я хочу сделать то же самое в приложении для Android.

Сценарий использования. На самом деле я использую robolectric для своих тестовых примеров, которые я могу запускать непосредственно на своем хост-компьютере, а не на эмуляторе. На самом деле это очень удобно для вещей, не связанных с графическим интерфейсом. Некоторые из моих кодов создают журналы Android. Я не могу прикрепить logcat, чтобы увидеть результат этого. Я могу перенаправить журналы на обычный стандартный вывод. Но на данный момент у меня нет фильтрации, так что это либо grep, либо что-то подобное, либо просеивание тысяч строк ненужного материала.


person Andre    schedule 03.01.2015    source источник
comment
Создать прокси-класс для обработки всех распечаток журнала и фильтровать его?   -  person Mike M.    schedule 03.01.2015
comment
Конечно, я могу делать такие вещи. Robolectric предоставляет класс ShadowLog — там можно переназначить поток в частную реализацию с любой желаемой фильтрацией. Мне было интересно, доступно ли что-то подобное уже так или иначе.   -  person Andre    schedule 03.01.2015


Ответы (1)


Вот что я сделал:

    public class CustomPrintStream extends PrintStream {

    private String regexFilter;
private Pattern pattern;

public IonPrintStream(@NonNull File file) throws FileNotFoundException {
    super(file);
}

public String getRegexFilter() {
    return regexFilter;
}

public void setRegexFilter(String regexFilter) {
    this.regexFilter = regexFilter;
    if (regexFilter != null && !regexFilter.isEmpty()) {
        pattern = Pattern.compile(regexFilter);
    } else {
        pattern = null;
    }
}

@Override
public void println(String x) {

    if (x != null && pattern != null && !pattern.matcher(x).find()) {
        return;
    }

    System.out.println(x);
}
}

Использование в Robolectric (вы можете сделать это в своем методе @Before):

        File file = new File("log.txt");
        if (!file.exists() && !file.createNewFile()) {
            throw new RuntimeException("Log file could not be created");
        }

        CustomPrintStream printStream = new CustomPrintStream(file);
        printStream.setRegexFilter("[your regex here]");
        ShadowLog.stream = printStream;

В вашем случае, поскольку вы не хотите показывать некоторые журналы, вы можете отфильтровать что-то вроде этого:

        //I don't want to log CursorWindowStats and SQLiteCursor tags:
        printStream.setRegexFilter("^((?!CursorWindowStats|SQLiteCursor).)*$");
person Cícero Moura    schedule 07.11.2019