扼要
OTLogger是一个Android日志库,官方Log 高替版。允许一起把日志 输出到Logcat 和保存到磁盘。因其内部完成选用战略的设计模式,所以运用者能够根据自己的需求轻松定制该库的每个模块,包含日志输出格局、日志保存方式、捕获异常日志等。
简略运用
//运用 QTlogger
LogUtils.v(TAG, "V等级 日志")
LogUtils.d(TAG, "D等级 日志")
LogUtils.i(TAG, "I等级 日志")
LogUtils.w(TAG, "W等级 日志")
LogUtils.e(TAG, "E等级 日志")
便是这样简略,如同 Log 相同直接运用即可。默许会把日志打印到控制台,而且把日志输出到 Android/package/file/log
文件夹下,其输出的日志格局与Log
的格局共同。
OTLogger 的日志格局
OTLogger支撑三种默许的日志格局:
-
LogcatDefaultFormatStrategy
: 默许打印到logcat的日志格局,其格局和Log的输出格局保持共同。 2.LogTxtDefaultFormatStrategy
: 默许打印到磁盘的日志格局,其格局和Log的输出格局保持共同。 3.PrettyFromatStrategy
: 打印到Logcat且比较漂亮的日志格局: 由于该日志格局比较占有空间,所以不主张输出到存储文件中,也就没有完成打印到磁盘的日志格局。
设置日志格局的方式
val logger = Logger.Builder()
.setLogcatPrinter(
LogcatCustomPrinter(
true,
LogLevel.V,
PrettyFormatStrategy() //设置打印到Logcat运用PrettyFromatStrategy日志格局
)
)
.build()
LogUtils.setLogger(logger)
定制归于你的日志
以上是OTLogger最简略的运用方式,但是OTLogger能提供的并不仅仅局限于此,你能够基于OTLogger定制一个想要的日志库。
既然要定制,咱们先看看OTLogger的完成机制:
上图能够看到,LogUtils下调用的便是Logger,所以咱们界说归于自己的日志无非便是界说一自己的Logger。Logger下分为三层:
Printer 层 :打印机层
担任把日志打印到指定的方位,无论是把日志输出到Logcat还是磁盘,都是经过打印机(Printer)进行输出。现在界说有两种类型的打印机:
1. BaseLogcatPrinter: Logcat打印机
担任打印日志到Logcat,是一个抽象类。当咱们需求定制自己的Logcat Printer 的时分,能够承继并重写BaseLogcatPrinter
内部的办法即可。你也能够承继咱们现已完成的 Logcat Printer :
-
LogcatDefaultPrinter
:默许的Logcat Printer,选用了LogcatDefaultFormatStrategy
日志格局,最低日志输出等级是:V
-
LogcatCustomPrinter
: 可自界说的 Logcat Printer。
/**
* 自界说 Loacat 打印机
* @property printable 是否打印日志到 logcat
* @property minLevel 最小日志输出等级
* @property formatStrategy 日志格局战略,挑选你想要的日志格局战略
*/
open class LogcatCustomPrinter(val printable:Boolean
, val minLevel: LogLevel
, val formatStrategy:BaseFormatStrategy
):BaseLogcatPrinter()
2.BaseLogTxtPrinter: 磁盘打印机
担任打印日志到磁盘文件中,是一个抽象类。当咱们需求定制自己的 磁盘 Printer 的时分,能够承继并重写BaseLogTxtPrinter
内部的办法即可。你也能够承继咱们现已完成的 LogTxt Printer :
-
LogTxtDefaultPrinter
:默许的的LogTxt Printer。内部选用了LogTxtDefaultFormatStrategy
日志格局,最低日志输出等级是:V
。 -
LogTxtCustomPrinter
:可自界说的 LogTxt Printer。
/**
* 自界说日志文件打印机
* @property printable 是否写入到文件
* @property minLevel 最低输出日志
* @property formatStrategy 日志格局战略
* @property diskStrategy 文件办理战略
*/
open class LogTxtCustomPrinter(val printable:Boolean
, val minLevel:LogLevel
, val formatStrategy: BaseFormatStrategy
, val diskStrategy:BaseLogDiskStrategy
):BaseLogTxtPrinter()
Format 层:日志格局层
该层界说了日志输出的格局,经过承继BaseFormatStrategy
完成,每个Printer都包含一个FormatStrategy,所以每个Printer 都能够拥有自己的日志格局。现在OTLogger 现已包含了三种日志格局:
-
LogcatDefaultFormatStrategy
:(输出到Logcat专属) 默许输出到Logcat的日志格局,在BaseLogcatPrinter
中选用该日志格局,输出的日志和Log打印到Logcat是共同的。 -
PrettyFormatStrategy
: (输出到Logcat专属) 漂亮的日志格局。 -
LogTxtDefaultFormatStrategy
:(输出到磁盘专属),默许输出到磁盘的日志格局。
留意: 上面特意标注了该日志格局是’Logcat’还是’磁盘’专属是有意义的。由于:
- 输出到Logcat的日志本质上还是调用
Log.println(int priority, String tag, String msg)
函数进行打印,所以咱们无法定制输出的时刻、PID 等信息;只能定制其间的 msg 信息,所以专属Logcat的BaseFormatStrategy.format()
返回的String对应的msg参数。- 相对的,专属磁盘的
BaseFormatStrategy.format()
返回的String对应打印到磁盘的整条日志信息。
Disk层:磁盘办理层
该层办理了一切的日志文件,只要 LogTxt Printer才会运用到,首要处理的问题:
每一行日志打印打印到哪个文件中?
何时分配一个新的日志文件?
何时回收旧的日志文件?
该层经过经过承继抽象类BaseLogDiskStrategy
完成。现在现已完成的DiskStrategy:
-
TimeLogDiskStrategyImpl
:按时刻办理日志文件;默许依照小时创立日志文件,默许日志文件保存七天,默许日志文件名:log_年_月_日_时刻段.log
,例:
//2023年2月12日15时到16时
otLog_2023_02_12_15_16.log
-
FileLogDiskStrategyImpl
:日志文件办理战略,按存储空间办理日志文件。- 默许每个日志文件5MB,参阅
getLogFileMaxSizeOfMB
- 默许日志文件夹最大可包容 100M日志,超越
getLogDirMaxStoreOfMB
会依照时刻次序删去旧的日志,直到低于预定值 - 默许文件名 otLog_年_月_日_时_分_秒.log , 例 : otLog_2023_02_12_16_28_56.log
- 默许每个日志文件5MB,参阅
-
FileAndTimeDiskStrategyImpl
: 文件+时刻办理战略,一起具有FileLogDiskStrategyImpl
和TimeLogDiskStrategyImpl
的特性。- 默许日志文件夹最大可包容 100M日志,超越
getLogDirMaxStoreOfMB
会依照时刻次序删去旧的日志,直到低于预定值 - 默许文件名 默许文件名 log_年_月_日_时刻段_创立时刻戳.log ,例:
otLog_2023_02_12_16_17_1233644846.log
- 默许日志文件夹最大可包容 100M日志,超越
留意:
以上一切的磁盘办理都是默许存储日志的文件夹都是storage/emulated/0/Android/data/packageName/files/log
,咱们能够经过重写getLogDir()
办法指定咱们的日志文件夹。
理解了上面的OTLogger后,咱们就知道怎么去界说归于咱们自己的日志。下面我举几个案例:
- 完成和默许OTLogger相同的作用:
val logger = Logger.Builder()
//设置Logcat Printer
.setLogcatPrinter(LogcatDefaultPrinter())
//设置LogTxt Printer
.setLogTxtPrinter(LogTxtDefaultPrinter())
.build()
LogUtils.setLogger(logger)
- 设置Logcat运用
PrettyFormatStrategy
格局,而且Logcat和logTxt中Debug等级以下的日志不输出:
val logger = Logger.Builder()
//设置Logcat Printer, 最低输出日志等级:Debug, 运用PrettyFormatStrategy 日志格局
.setLogcatPrinter(LogcatCustomPrinter(true,LogLevel.D,PrettyFormatStrategy()))
//设置LogTxt Printer, 最低输出日志等级:Debug, 运用LogTxtDefaultFormatStrategy日志格局(默许),TimeLogDiskStrategyImpl 磁盘办理格局(默许)
.setLogTxtPrinter(LogTxtCustomPrinter(true,LogLevel.D,LogTxtDefaultFormatStrategy(),TimeLogDiskStrategyImpl()))
.build()
LogUtils.setLogger(logger)
- 日志文件办理战略运用
FileAndTimeDiskStrategyImpl
- 指定日志文件夹是
storage/emulated/0/Android/data/packageName/files/myAppLog
; - 指定每个日志文件最大存储15M;
- 指定整个日志文件夹最大存储500M日志文件;
- 指定体系至少要剩余600M容量时分才能持续写入日志(防止日志把磁盘写满);
val diskStrategy = object :FileAndTimeDiskStrategyImpl(){
override fun getLogDir(): String {
//指定日志文件夹是`storage/emulated/0/Android/data/packageName/files/myAppLog`;
return app.getExternalFilesDir("")?.absolutePath+ File.separator+"myAppLog"
}
override fun getLogFileMaxSizeOfMB(): Long {
//指定每个日志文件最大存储15M;
return 15
}
override fun getLogDirMaxStoreOfMB(): Long {
//指定整个日志文件夹最大存储500M日志文件;
return 500
}
override fun getMinFreeStoreOfMB(): Long {
//指定体系至少要剩余600M容量时分才能持续写入日志(防止日志把磁盘写满);
return 600
}
}
val logger = Logger.Builder()
//设置Logcat Printer, 最低输出日志等级:Debug, 运用PrettyFormatStrategy 日志格局
.setLogcatPrinter(LogcatCustomPrinter(true,LogLevel.D,PrettyFormatStrategy()))
//设置LogTxt Printer, 最低输出日志等级:Debug, 运用LogTxtDefaultFormatStrategy日志格局(默许),TimeLogDiskStrategyImpl 磁盘办理格局(默许)
.setLogTxtPrinter(LogTxtCustomPrinter(true,LogLevel.D,LogTxtDefaultFormatStrategy(),diskStrategy))
.build()
LogUtils.setLogger(logger)
github 传送门
OTLogger