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

How can I monitor android.util.log or override it?

我在项目中到处都在使用日志。d/v/w/e。

现在,我想将所有日志保存到设备本地文件中。

不过,android.util.Logclass在最后class.

这意味着我无法从中扩展。

有没有办法接管 android.util.Log 的控制权,这样我就不需要在项目的任何地方更改日志。d/v/w/e?

我正在寻找一种简单的方法来了解是否调用了 log.d/v/w/e,以便我可以将信息写入本地文件。

当你需要添加一个 final 的功能时 class,一个常见的选择是使用装饰器(包装器)模式:

public class LogUtils {

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

  ...
}

这种日志记录实现非常流行。

但是,还有另一种选择来编写您自己的包装器。 Jake Wharton 的库 Timber 已经处理了所有的实用程序,并添加了一些其他的细节,比如自动标记和使用 String.format for 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();

  }
}

从文件中删除任何 'import android.util.Log',您可以包含自己的日志 class:

// 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 class 的完整 replacement/implementation,但它具有我使用的所有功能,如果需要,它很容易扩展。