Android 日志框架使用(Timber/Logger/XLog)

[TOC]
目录
Android 日志框架使用(Timber/Logger/XLog)
1.Timber
  Timber使用
  Timber参考链接
2.Logger
  Logger 使用
  Logger 参考链接
3.XLog
  XLog使用
  XLog参考链接

Android 日志框架使用(Timber/Logger/XLog)

1.Timber

Timber 是个流行 Android 日志记录库,由 Jake Wharton 提供的, 对于Timber

源码地址(github): https://github.com/JakeWharton/timber

国内镜像(gitee): https://gitee.com/yinlingchaoliu/timber

Timber使用

dependencies {
    ...
    implementation 'com.jakewharton.timber:timber:5.0.1'
}

如果想依赖其他版本可以查看仓库中Timber各个版本情况https://central.sonatype.com/artifact/com.jakewharton.timber/timber/versions

然后在Application中即可

Timber.plant(new Timber.DebugTree());

我们也可在初始的时候进行一些处理, 比如重写createStackElementTag方法 让日志打印行号和类名

        Timber.plant(new Timber.DebugTree() {
            @Override
            protected @Nullable
            String createStackElementTag(@NotNull StackTraceElement element) {
                return "(" + element.getFileName() + ":" + element.getLineNumber() + ")[" + Thread.currentThread().getName() + "]";
            }
        });

或者重写log方法进行自定义的日志文件存储

Timber.plant(object : Timber.DebugTree() {
    override fun createStackElementTag(element: StackTraceElement): String? {
        return "(" + element.fileName + ":" + element.lineNumber + ")"
    }

    override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
        super.log(priority, tag, message, t)
        if (priority == Log.ERROR) {
            LogUtils.e(xxxx)//通过自定义的LogUtils进行 日志文件存储 
        } else { 
            LogUtils.d(xxxx)//通过自定义的LogUtils进行 日志文件存储 
        }
    }
})

使用

Timber.d("Debug message");
Timber.i("Info message");
Timber.w("Warning message");
Timber.e("Error message");

Timber.i("Info message with %s", "formatting"); // 支持格式化
Timber.i("User %s logged in with id %d", username, userId);

Timber.e(throwable,"xxx Exception");

Timber参考链接

其他操作详细可以参考链接

Android 日志记录的最佳实践 https://blog.csdn.net/weixin_37600397/article/details/140286579

源码解析参考链接:

日志框架Timber使用与源码解析 https://www.jianshu.com/p/b464f59ba3cd

Android 常用三种日志框架[Logger、Timber、XLog] https://blog.csdn.net/banzhuantuqiang/article/details/141821636

三款 Android 日志框架对比「Logger、Timber、XLog」https://juejin.cn/post/7274982412245925928

2.Logger

Logger 是一个非常简单且轻量级的日志库,它提供了与 Timber 类似的功能,但没有那么多扩展性。它的主要优点是易于集成和使用。

源码地址(github): https://github.com/orhanobut/logger

国内镜像(gitee): https://gitee.com/tank-runner/logger

仓库中Logger 各个版本情况 https://central.sonatype.com/artifact/com.orhanobut/logger/versions

Logger 使用

依赖

implementation 'com.orhanobut:logger:2.2.0'

初始化

Logger.addLogAdapter(new AndroidLogAdapter());

//也可以进行配置
FormatStrategy formatStrategy = PrettyFormatStrategy.newBuilder()
  .showThreadInfo(false)  // (Optional) Whether to show thread info or not. Default true
  .methodCount(0)         // (Optional) How many method line to show. Default 2
  .methodOffset(7)        // (Optional) Hides internal method calls up to offset. Default 5
  .logStrategy(customLog) // (Optional) Changes the log strategy to print out. Default LogCat
  .tag("My custom tag")   // (Optional) Global tag for every log. Default PRETTY_LOGGER
  .build();
Logger.addLogAdapter(new AndroidLogAdapter(formatStrategy));

//Save logs to the file
Logger.addLogAdapter(new DiskLogAdapter());

//Loggable
Logger.addLogAdapter(new AndroidLogAdapter() {
  @Override public boolean isLoggable(int priority, String tag) {
    return BuildConfig.DEBUG;
  }
});
//Add custom tag to Csv format strategy
FormatStrategy formatStrategy = CsvFormatStrategy.newBuilder()
  .tag("custom")
  .build();
Logger.addLogAdapter(new DiskLogAdapter(formatStrategy));
//默认 Path为 Environment.getExternalStorageDirectory().getAbsolutePath()/ "logger"

使用

Logger.d("debug");
Logger.e("error");
Logger.w("warning");
Logger.v("verbose");
Logger.i("information");
Logger.wtf("What a Terrible Failure");

Logger.d(MAP);
Logger.d(SET);
Logger.d(LIST);
Logger.d(ARRAY);

Logger.json(JSON_CONTENT);
Logger.xml(XML_CONTENT);

Logger 参考链接

其他操作详细可以参考链接

android中logger使用 https://blog.51cto.com/u_16213341/12457597

3.XLog

XLog 提供了更丰富的特性,比如对多线程的支持、内置的文件写入支持以及更加灵活的日志格式化选项。

源码地址(github): https://github.com/elvishew/xLog

国内镜像(gitee): https://gitee.com/robchou/xLog

仓库中XLog各个版本情况 https://central.sonatype.com/artifact/com.elvishew/xlog/versions

XLog使用

依赖

implementation 'com.elvishew:xlog:1.11.1'

初始化

//简单的方式
XLog.init(LogLevel.ALL);

//高级方式
LogConfiguration config = new LogConfiguration.Builder()
    .logLevel(BuildConfig.DEBUG ? LogLevel.ALL             // 指定日志级别,低于该级别的日志将不会被打印,默认为 LogLevel.ALL
        : LogLevel.NONE)
    .tag("MY_TAG")                                         // 指定 TAG,默认为 "X-LOG"
    .enableThreadInfo()                                    // 允许打印线程信息,默认禁止
    .enableStackTrace(2)                                   // 允许打印深度为 2 的调用栈信息,默认禁止
    .enableBorder()                                        // 允许打印日志边框,默认禁止
    .jsonFormatter(new MyJsonFormatter())                  // 指定 JSON 格式化器,默认为 DefaultJsonFormatter
    .xmlFormatter(new MyXmlFormatter())                    // 指定 XML 格式化器,默认为 DefaultXmlFormatter
    .throwableFormatter(new MyThrowableFormatter())        // 指定可抛出异常格式化器,默认为 DefaultThrowableFormatter
    .threadFormatter(new MyThreadFormatter())              // 指定线程信息格式化器,默认为 DefaultThreadFormatter
    .stackTraceFormatter(new MyStackTraceFormatter())      // 指定调用栈信息格式化器,默认为 DefaultStackTraceFormatter
    .borderFormatter(new MyBoardFormatter())               // 指定边框格式化器,默认为 DefaultBorderFormatter
    .addObjectFormatter(AnyClass.class,                    // 为指定类型添加对象格式化器
        new AnyClassObjectFormatter())                     // 默认使用 Object.toString()
    .addInterceptor(new BlacklistTagsFilterInterceptor(    // 添加黑名单 TAG 过滤器
        "blacklist1", "blacklist2", "blacklist3"))
    .addInterceptor(new MyInterceptor())                   // 添加一个日志拦截器
    .build();

Printer androidPrinter = new AndroidPrinter(true);         // 通过 android.util.Log 打印日志的打印器
Printer consolePrinter = new ConsolePrinter();             // 通过 System.out 打印日志到控制台的打印器
Printer filePrinter = new FilePrinter                      // 打印日志到文件的打印器
    .Builder("<日志目录全路径>")                             // 指定保存日志文件的路径
    .fileNameGenerator(new DateFileNameGenerator())        // 指定日志文件名生成器,默认为 ChangelessFileNameGenerator("log")
    .backupStrategy(new NeverBackupStrategy())             // 指定日志文件备份策略,默认为 FileSizeBackupStrategy(1024 * 1024)
    .cleanStrategy(new FileLastModifiedCleanStrategy(MAX_TIME))     // 指定日志文件清除策略,默认为 NeverCleanStrategy()
    .flattener(new MyFlattener())                          // 指定日志平铺器,默认为 DefaultFlattener
    .writer(new MyWriter())                                // 指定日志写入器,默认为 SimpleWriter
    .build();

XLog.init(                                                 // 初始化 XLog
    config,                                                // 指定日志配置,如果不指定,会默认使用 new LogConfiguration.Builder().build()
    androidPrinter,                                        // 添加任意多的打印器。如果没有添加任何打印器,会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)
    consolePrinter,
    filePrinter);

打印日志

XLog.d("你好 xlog");

XLog.e(message, throwable);

XLog.d("你好%s,我今年 %d 岁", "Elvis", 20);

XLog.json(JSON_CONTENT);
XLog.xml(XML_CONTENT);

XLog.d(array);
XLog.d(list);
XLog.d(map);

XLog.d(intent);
XLog.d(bundle);

XLog.d(object);


Logger logger = XLog.tag("TAG-A")
                    ... // 其他配置的覆盖
                    .build();
logger.d("定制了 TAG 的消息");


Logger logger = XLog.enableBorder()
                    .enableThread()
                    ... // 其他配置的覆盖
                    .build();
logger.d("带有线程信息和日志边框的消息");

XLog.tag("TAG-A").d("定制了 TAG 的消息");
XLog.enableBorder().enableThread().d("带有线程信息和日志边框的消息");

XLog参考链接

Android 应用开发必备日志库 xLog https://www.jianshu.com/p/ea9767ce7608

(elvishwe 的官文)史上最强的 Android 日志库 XLog https://www.jianshu.com/p/1769d8aa1783

XLog 详解及源码分析 https://www.jianshu.com/p/15ff181cc2f8

其他

打印错误日志堆栈

Log.getStackTraceString(t);//通过 android.util.Log可以获取

//或者通过
Timber.e(e,"xxx Exception");
Logger.e(e,"xxx Exception")
XLog.e(message, throwable);

eg Timber.e后面上通过getStackTraceString方法实现代码如下:

private fun getStackTraceString(t: Throwable): String {
    // Don't replace this with Log.getStackTraceString() - it hides
    // UnknownHostException, which is not what we want.
    val sw = StringWriter(256)
    val pw = PrintWriter(sw, false)
    t.printStackTrace(pw)
    pw.flush()
    return sw.toString()
}

此外 Java时间戳字符串的优化 https://www.jianshu.com/p/45f78c3e779a

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容