Android 常用三种日志框架[Logger、Timber、XLog]

2024-09-02 23:36

本文主要是介绍Android 常用三种日志框架[Logger、Timber、XLog],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、日志框架背景

如果我们需要用三方库,那就意味着基于原生方案会存在一些痛点,我们不得不使用某种手段去解决这些痛点。那原生 Logcat 存在哪些痛点,我们来聊一聊:

  • 日志不能持久化,缓冲区日志很容易丢失
  • 如果系统压力大有可能会导致日志折叠、丢失
  • 无法定义日志输出格式,如:json、xml
  • 无法快速定位日志输出时的代码位置
  • 其实前两个才是主要痛点,日志不丢失,有途径能获取到已打印的日志这是我们最基础的需求。只要日志不丢失,其他问题说实话都可以克服。

二、期望日志框架能力

  • 方案轻量,入侵度越低越好
  • 集成方便、快捷,不应该在集成日志库上花费太多时间
  • 日志留存,至少可以存储到本地磁盘
  • 文件策略管理,处理文件备份、删除等策略
  • 输出格式规整,最好能自定义输出格式
  • 方便筛选,可根据日志级别、标签筛选
  • 代码位置定位,可从 IDE 直接调到相关代码位置
  • 配置丰富,给开发者高度的自由

三、框架介绍

这里主要说下XLog的用法,也是博主目前在项目中采用的日志框架,其他两种如果需要,自行研究,这里简单介绍。

1、Logger

Logger orhanobut/logger是一个比较早期的日志框架,积累到现在的人气超高,拥有将近 14K 的 Star。这个库非常轻量,满打满算整个库只有 13 个类

日志输出格式还是挺好看的,可以直接输出 Collection、json、xml 类型数据,但是不能自定义输出格式。 日志可以保存到磁盘,但不能配置文件相关策略(文件名、备份、删除等),可以理解为,有存储文件功能,但不多。

前面也提到,这个框架非常轻量,只有十多个类,它可以满足我们基本的日志需求,将日志保存到文件,且不会丢失。日志输出格式也还不错。但相对而言,对于个性化的支持就比较欠缺了。比如,输出格式是不能简单自定义的,比如我如果只想输出一行日志,不输出表格线,那就会比较麻烦。

2、Timber

Timber JakeWharton/timber是 Jake Wharton 大神出品。他原话是:老是要把打日志这部分代码拷来拷去太麻烦了,所以以库的形式开源出来。Timber 与其他日志库不太一样的是它并没有提供很多功能,而是搭建了一个日志功能框架,大家可以按照自己的需求来构建自己的Tree

前面我们说 Logger 库很简单只有十几个类,而 Timber 更简单,只有一个类文件,使用 Kotlin 语言。不过这些代码主要是框架代码,只有一个实现类DebugTree用来实现原生控制台输出日志,可以自已自定义输出格式,可以不用指定 TAG,默认 TAG 为类名.

注:如果你需要将日志输出到文件的实现,那这个库是不支持的。它可以将日志多种输出形式集中成Tree,通过Forest去统一管理

3、XLog

轻量、美观强大、可扩展的 Android 和 Java 日志库,可同时将日志打印在如 Logcat、Console 和文件中。如果你愿意,你可以将日志打印到任何地方。

https://github.com/elvishew/xLog

日志格式与 Logger 还是挺像的,不同的是 XLog 可以自定义输出格式,Logger 不行。就比如这些花里胡哨的 boder,在 XLog 里可以方便配置,而 Logger 则麻烦不少。

常用日志配置:

java
复制代码
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(                                                 // 初始化 XLogconfig,                                                // 指定日志配置,如果不指定,会默认使用 new LogConfiguration.Builder().build()androidPrinter,                                        // 添加任意多的打印器。如果没有添加任何打印器,会默认使用 AndroidPrinter(Android)/ConsolePrinter(java)consolePrinter,filePrinter);

XLog 的配置非常丰富、灵活,所以它比前两个库类要多一些,50+左右,也算非常轻量。如果你不想自定义配置,只需要XLog.init(LogLevel.ALL);即可完成初始化,全部使用 XLog 缺省配置。

XLog 的配置非常多,主要分为几大类,我们来看下配置接口的目录结构:

arduino
复制代码
├── formatter  
│ ├── Formatter.java  // 日志输出格式化接口
│ ├── border  
│ │ └── BorderFormatter.java  // 装饰线格式化接口
│ ├── message  
│ │ ├── json  
│ │ │ └── JsonFormatter.java  // json 格式化接口
│ │ ├── object  
│ │ │ └── ObjectFormatter.java  // 对象格式化接口
│ │ ├── throwable  
│ │ │ └── ThrowableFormatter.java  // 异常格式化接口
│ │ └── xml  
│ │ └── XmlFormatter.java  // xml 格式化接口
│ ├── stacktrace  
│ │ └── StackTraceFormatter.java  // 堆栈格式化接口
│ └── thread  
│ └── ThreadFormatter.java  // 线程id、name 输出格式化
├── interceptor  
│ └── Interceptor.java  // 拦截器
└── printer  
│ └── Printer.java //日志输出接口  
├── file  
│ ├── backup  
│ │ ├── BackupStrategy.java  // 日志备份策略接口
│ │ └── BackupStrategy2.java  
│ ├── clean  
│ │ └── CleanStrategy.java  // 日志清除策略接口  
│ ├── naming  
│ │ └── FileNameGenerator.java  // 文件命名接口
│ └── writer  
│   └── Writer.java  // 文件输入接口
└── flattener  └── LogFlattener.java // 日志字段排列接口

配置主要分为以下几类:

  • 日志打印
  • 日志格式化
  • 文件输入
  • 文件备份策略
  • 文件清除策略
  • 日志字段排列

 XLog 的架构思想与 Timber 差不多是一致的,日志框架基于功能接口管理所有日志输出,框架本身的日志输出实现一样是基于框架定义的接口。不同的是,XLog 接口定义得更细致,有二十多个接口。同时,框架本身也有所有接口的全部默认实现,这些实现就已经可以满足部分开发者。如果不满足,那 XLog 的高可配置性就体现出来了,你可以基于框架定义自己的实现。

四、XLog集成和使用示例

(该示例仅提供参考,具体可以根据需要扩展)

1、集成

在项目build.gradle中添加

implementation("com.elvishew:xlog:1.11.1")
2、封装的XLog工具类-XLogUtil.kt,代码如下
object XLogUtil {fun init() {val config = LogConfiguration.Builder().logLevel(LogLevel.ALL).tag("AndroidGifAgent").enableThreadInfo().xmlFormatter(DefaultXmlFormatter()).stackTraceFormatter(DefaultStackTraceFormatter()).build();val androidPrinter =AndroidPrinter(true) Printer that print the log using android.util.Logval logFolder =Environment.getExternalStorageDirectory().toPath().toString() + "/android_gif"val filePrinter = FilePrinter.Builder(logFolder).fileNameGenerator(MyFileNameGenerator())//日志文件名格式.backupStrategy(FileSizeBackupStrategy((500 * 1024 * 1024).toLong()))//单个日志文件的大小默认:FileSizeBackupStrategy(1024 * 1024).cleanStrategy(FileLastModifiedCleanStrategy(10L * 24L * 60L * 60L * 1000L))//日志文件存活时间,单位毫秒.flattener(ClassicFlattener())//配置写入文件日志格式:年月日时分秒.writer(SimpleWriter())//配置了writer才支持日志写文件.build()XLog.init(config, androidPrinter, filePrinter)}fun d(msg: String) {XLog.d(msg)}fun i(msg: String) {XLog.i(msg)}fun e(msg: String) {XLog.e(msg)}fun w(msg: String) {XLog.w(msg)}fun v(msg: String) {XLog.v(msg)}
}
3、在application中初始化
XLogUtil.init()
4、使用XLog
XLogUtil.d("btnClientSend data")

这篇关于Android 常用三种日志框架[Logger、Timber、XLog]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1131386

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、