#android #logcat #android-log
#Android #logcat #android-log
Вопрос:
Я использую log.d / v / w / e везде в проекте.
Теперь я хочу сохранить все журналы в локальный файл устройства.
Однако android.util.Класс журнала в последнем классе.
Это означает, что я не могу выйти из него.
Есть ли способ взять на себя управление android.util.Log, чтобы мне не нужно было изменять log.d / v / w / e везде в проекте?
Я ищу простой способ узнать, вызывается ли log.d / v / w / e, и чтобы я мог записать информацию в локальный файл.
Ответ №1:
Когда вам нужно добавить функциональность конечного класса, обычным вариантом является использование шаблона декоратора (оболочки):
public class LogUtils {
public static void LOGE(String tag, String message) {
Log.e(tag, message);
doSomethingElse();
}
...
}
Такая реализация для ведения журнала довольно популярна.
Однако есть еще один вариант написания собственной оболочки. Библиотека Джейка Уортона Timber уже обрабатывает все утилиты и добавляет некоторые другие тонкости, такие как автоматические теги и использование 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();
}
}
Ответ №2:
Удалите любой ‘import 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.Класс журнала, но в нем есть все функции, которые я использую, и его легко расширить, если вам нужно.