Как я могу отслеживать android.util.log или переопределять его?

Я использую log.d/v/w/e везде в проекте.

Теперь я хочу сохранить все журналы в локальный файл устройства.

Однако класс android.util.Log в последнем классе.

Это означает, что я не могу расширить его.

Есть ли способ взять на себя управление android.util.Log, чтобы мне не нужно было везде в проекте менять log.d/v/w/e?

Я ищу простой способ узнать, вызывается ли log.d/v/w/e, и чтобы я мог записать информацию в локальный файл.

2
0
943
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вам нужно добавить функциональность к конечному классу, распространенным вариантом является использование шаблона декоратора (обертки):

public class LogUtils {

  public static void LOGE(String tag, String message) {
     Log.e(tag, message);
     doSomethingElse();
  }

  ...
}

Такая реализация ведения журнала довольно популярна.

Однако есть еще один вариант написания собственной оболочки. Библиотека Jake Wharton Древесина уже поддерживает все утилиты и добавляет некоторые другие тонкости, такие как автоматические теги и использование String.format для Java.

Вы можете добавить свои собственные функции для обработки собственной диагностической логики, например:

public class MyLoggingClass extends DebugTree {

  @Override
  public void log(int priority, String tag, String message, Throwable t) {

    if (BuildConfig.DEBUG) {
       super.log(priority, tag, message, t);
    }

    doSomethingElse();

  }
}

Удалите любой «импорт android.util.Log» из файла, и вы можете включить свой собственный класс журнала:

// log.java
package com.my.package;

public class Log {
    public static int v(String tag, String msg) { return println(android.util.Log.VERBOSE, tag, msg); }
    public static int d(String tag, String msg) { return println(android.util.Log.DEBUG,   tag, msg); }
    public static int i(String tag, String msg) { return println(android.util.Log.INFO,    tag, msg); }
    public static int w(String tag, String msg) { return println(android.util.Log.WARN,    tag, msg); }
    public static int e(String tag, String msg) { return println(android.util.Log.ERROR,   tag, msg); }

    public static int println(int priority, String tag, String msg)  {
        // Do another thing
        return android.util.Log.println(priority, tag, msg);
    }
}

Затем вы можете оставить все свои строки «Log.e» нетронутыми, но все равно перехватывать строки регистрации.

Это не полная замена/реализация класса android.util.Log, но в нем есть все функции, которые я использую, и его легко расширить, если вам нужно.

Другие вопросы по теме