如何监控android.util.log或覆盖它?

4
我在整个项目中都使用log.d/v/w/e。
现在,我想将所有日志保存到本地设备文件中。
然而,android.util.Log类是最终类,这意味着我不能从它进行扩展。
有没有一种方法可以接管android.util.Log的控制权,以便我不需要在整个项目中更改log.d/v/w/e?
我正在寻找一个简单的方法来知道是否调用了log.d/v/w/e,并且我可以将信息写入本地文件。
2个回答

4
当你需要增加最终类的功能时,常见的选择是使用装饰器(包装器)模式:
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
从文件中删除任何 '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类的完全替代/实现,但它具有我使用的所有功能,并且如果需要,很容易扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接