我在项目中的每个地方都使用log.d / v / w / e。
现在,我想将所有日志保存到设备本地文件中。
但是,最后一个类中的android.util.Log类。
这意味着我不能扩展它。
有没有办法接管android.util.Log的控制权,这样我就不需要在项目的任何地方更改log.d / v / w / e了?
我正在寻找一种简单的方法来知道是否调用了log.d / v / w / e,以便可以将信息写入本地文件。
答案 0 :(得分:1)
当您需要添加最终类的功能时,通常的选择是使用装饰器(包装器)模式:
public class LogUtils {
public static void LOGE(String tag, String message) {
Log.e(tag, message);
doSomethingElse();
}
...
}
这种用于日志记录的实现非常流行。
但是,还有另一种方法可以编写自己的包装器。杰克·沃顿(Jake Wharton)的库Timber已经处理了所有实用程序,并添加了其他一些功能,例如自动标记和Java的String.format的使用。
您可以添加自己的功能来处理自己的诊断逻辑,例如:
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();
}
}
答案 1 :(得分:1)
从文件中删除任何“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.Log 类的完整替代/实现,但它具有我使用的所有功能,并且如果您需要,它很容易扩展。