上一篇blog记录了实现一个基本日志包的过程,这里自己尝试实现一个带有rolling功能的日志包
其实从性能和功能单一的角度来说,很多日志库是不支持rolling相关的功能的,比如uber推出的zap日志包,就推荐用户自己通过logrotate等方式自己去处理日志rolling的问题。 不过有些场景下,我们希望日志文件能不需要外界干预的情况下正常运行。 可以通过实现一个支持rolling的io.Writer来解决这个问题。
基本功能
- 支持多种rolling类型, 不切割,按日期切割,按文件大小切割
- 能设置备份文件大小和个数,支持多余日志自动清理
在github上看到一个已经有人实现了一个这样的工具包lumberjack,从包中的Logger对象定义看,可以指定备份文件的大小/个数/保存日期,会按照时间来命令备份文件,并自动清除过期或者超过备份文件总数的日志,同时提供备份日志压缩功能。
所以犯懒,直接集成这个包来做日志切割了,如下是lumberjack包中Logger struct的定义
1 | type Logger struct { |
v2版本日志包设计思路
这里在上篇博文的v1版本基础上,设计v2版本的日记包。
在包中声明一个RollingConf对象,来指明日志滚动切割配置,RollingType=0 则不切割日志,RollingType=1则按照文件大小来切割,这里暂时不支持按天进行日志文件滚动切割。
1 | type RollingConf struct { |
在这个v2版本的初始化日志对象函数NewLogger进行修改,传参增加一个RollingConf参数,完整的日志对象初始化函数如下。基本思路就是,如果不开启rolling,则使用os.OpenFile去实现io.Writer接口,如果开启rolling,则调用lumberjack包,创建一个支持rolling的对象,这个对象同样实现了io.Writer接口。v2版本其他部分和v1保持一致,使用的时候,对v1,v2两个版本的变化是无感知的。
1 | #v2/log.go |
v2版本使用测试
1 | #main.go |