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

Posted

技术标签:

【中文标题】如何监控 android.util.log 或覆盖它?【英文标题】:How can I monitor android.util.log or override it? 【发布时间】:2019-08-31 07:15:20 【问题描述】:

我在项目的任何地方都使用 log.d/v/w/e。

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

然而,android.util.Log类在final类中。

这意味着我无法扩展它。

有没有办法接管对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();
  

  ...

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

但是,还有另一种选择来编写自己的包装器。 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();

  

【讨论】:

【参考方案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.Log 类的完全替代/实现,但它具有我使用的所有功能,并且如果您需要,它很容易扩展。

【讨论】:

以上是关于如何监控 android.util.log 或覆盖它?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 proguard 配置为仅删除 android 日志记录调用

如何将输出写入 Android 中的 Log?

idea开发android,调试log打印如何可以和eclipse显示一样?

如何查看log日志文件

我的Android进阶之旅------>Android关于Log的一个简单封装

Android(LogcatMonitors)