扼要

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支撑三种默许的日志格局:

  1. LogcatDefaultFormatStrategy: 默许打印到logcat的日志格局,其格局和Log的输出格局保持共同。 2.LogTxtDefaultFormatStrategy: 默许打印到磁盘的日志格局,其格局和Log的输出格局保持共同。 3.PrettyFromatStrategy: 打印到Logcat且比较漂亮的日志格局:
    OTLogger 日志库:轻松定制属于你的日志
    由于该日志格局比较占有空间,所以不主张输出到存储文件中,也就没有完成打印到磁盘的日志格局。

设置日志格局的方式

val logger = Logger.Builder()
    .setLogcatPrinter(
        LogcatCustomPrinter(
            true,        
            LogLevel.V,
            PrettyFormatStrategy()  //设置打印到Logcat运用PrettyFromatStrategy日志格局
        )
    )
    .build()
LogUtils.setLogger(logger)

定制归于你的日志

以上是OTLogger最简略的运用方式,但是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是共同的。

    OTLogger 日志库:轻松定制属于你的日志

  • PrettyFormatStrategy: (输出到Logcat专属) 漂亮的日志格局。

    OTLogger 日志库:轻松定制属于你的日志

  • LogTxtDefaultFormatStrategy:(输出到磁盘专属),默许输出到磁盘的日志格局。

    OTLogger 日志库:轻松定制属于你的日志

留意: 上面特意标注了该日志格局是’Logcat’还是’磁盘’专属是有意义的。由于:

  1. 输出到Logcat的日志本质上还是调用Log.println(int priority, String tag, String msg) 函数进行打印,所以咱们无法定制输出的时刻、PID 等信息;只能定制其间的 msg 信息,所以专属Logcat的BaseFormatStrategy.format() 返回的String对应的msg参数。
  2. 相对的,专属磁盘的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
  • FileAndTimeDiskStrategyImpl: 文件+时刻办理战略,一起具有FileLogDiskStrategyImplTimeLogDiskStrategyImpl 的特性。
    • 默许日志文件夹最大可包容 100M日志,超越getLogDirMaxStoreOfMB会依照时刻次序删去旧的日志,直到低于预定值
    • 默许文件名 默许文件名 log_年_月_日_时刻段_创立时刻戳.log ,例:
    otLog_2023_02_12_16_17_1233644846.log
    

留意:
以上一切的磁盘办理都是默许存储日志的文件夹都是storage/emulated/0/Android/data/packageName/files/log,咱们能够经过重写getLogDir()办法指定咱们的日志文件夹。

理解了上面的OTLogger后,咱们就知道怎么去界说归于咱们自己的日志。下面我举几个案例:

  1. 完成和默许OTLogger相同的作用:
val logger = Logger.Builder()
     //设置Logcat Printer
    .setLogcatPrinter(LogcatDefaultPrinter())
    //设置LogTxt Printer
    .setLogTxtPrinter(LogTxtDefaultPrinter())
    .build()
LogUtils.setLogger(logger)
  1. 设置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)
  1. 日志文件办理战略运用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