Android 日志记录轻量级框架 Timber

前言

Log 日志在 Android 项目开发中的作用非常重要,但项目越做越大,开发者会面临很多问题,比如管理各种不同的 Log,不同版本控制是否输入 Log 等。Timber 是一个轻量级的第三方库,能够帮助开发者更好的使用 Android Log。

面临问题

  1. 项目使用 Log 规范不统一,例如:关于 okhttp 的实现使用了 Logging Interceptor 输出 log,关于 rxjava 的实现使用了 onError,其他使用了 Android Log 机制。
  2. 项目开发时,为了方便调试,需要输出 Log,但发布后,Log 中包含很多项目相关的信息,如果全部暴露会有安全隐患,但完全删除也不利于发生问题后的查看调试,因此需要一个开关,关闭开关则不能输出 log,打开开关则可以输出 log。

Timber 介绍

Timeber 的使用主要通过添加 Tree 实例,添加 Tree 实例可以通过方法 Timber.plant 完成。实例化 Tree 需要尽量早,推荐在项目 ApplicationonCreate() 方法中完成。其中,DebugTree 自动实例化,是 Timber 中已经实现了 tree 的类,可直接拿来用,并在使用他的类中以类名为其 TAG,但是其他的 Tree 不会自动实例化,需要进行手动实现扩展 Timber.Tree 实现。

引入库

在build.gradle中:

compile 'com.jakewharton.timber:timber:4.5.1'

注册库

在onCreate()中,建议是 Application 中。

if (BuildConfig.DEBUG) {
      Timber.plant(new Timber.DebugTree());
 } else {
      Timber.plant(new CrashReportingTree());
}

private static class CrashReportingTree extends Timber.Tree {
    @Override 
     protected void log(int priority, String tag, String message, Throwable t) {

     }
}

如何使用

Timber.tag("activityName");
Timber.d("Activity Created");

特点和优势

不再重复使用 TAG。之前使用 Log 方法每次使用都需要定义并传入一个 TAG,在 Timber 中,若使用 DebugTree,默认为当前类类名,若使用自定义 Tree,直接定义一次,到处使用,不需重复设置。

在打 Timber 调用处,不仅可以只输出 Log,还可以执行其他操作。比如:存到数据库,进行输出,Socket 传输,甚至显示到UI界面上等,只需要自定义 Tree,并将对应逻辑在 log(int priority, String tag, String message, Throwable t) 方法中实现。

统一项目Log日志方法,输出形式,输出时间,更加符合面向对象思想。

输出 Log 控制

isLoggable 方法作为开关控制 Log 输出。

boolean isLoggable (String tag, int level)

通过指定标签指定级别,控制日志是否显示。默认级别为 Info,表示高于或等于 Info 级别的日志都可以显示。

远程设置系统属性更改默认级别:

adb -d shell setprop log.tag.<YOUR_LOG_CAT> <LEVEL>

系统目录 /data/local.prop,创建一个 local.prop 文件,文件内容:

log.tag.<YOUR_LOG_TAG>=<LEVEL>

Level 级别

LEVELNUMBER
VERBOSE2
DEBUG3
INFO4
WARN5
ERROR6
ASSERT7

示例

在自定义 Tree 中的 log 方法中进行控制,若为 Debug 环境下,可以产出 log;若为 Release 环境,且打开开关,则可以产生 log;若为 Release 环境,且关闭开关,则不可产生log。

Java代码如下:

public class LogTree extends Timber.DebugTree{

    @override
    protected void log(int priority, String tag, String message, Throwable t){
        if(BuildConfig.DEBUG || Log.isLoggable("MyTag", Log.DEBUG)){
            super.log(priority, tag, message, t);
        }
    }
}

命令行中:

若执行如下命令,则打开开关,可以产生log:

adb -d shell setprop log.tag.MyTag DEBUG

若执行如下命令,则关闭开关,不可产生log:

adb -d shell setprop log.tag.MyTag WARN