Я использую log.d/v/w/e везде в проекте.
Теперь я хочу сохранить все журналы в локальный файл устройства.
Однако класс android.util.Log в последнем классе.
Это означает, что я не могу расширить его.
Есть ли способ взять на себя управление android.util.Log, чтобы мне не нужно было везде в проекте менять log.d/v/w/e?
Я ищу простой способ узнать, вызывается ли log.d/v/w/e, и чтобы я мог записать информацию в локальный файл.
Когда вам нужно добавить функциональность к конечному классу, распространенным вариантом является использование шаблона декоратора (обертки):
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, но в нем есть все функции, которые я использую, и его легко расширить, если вам нужно.