- Created by 郭强, last modified on Jul 28, 2022
滚动切分目前属于实验性特性,如有问题请随时反馈。
之前的章节中我们知道,glog
组件支持通过设置日志文件名称的方式,使得日志文件按照日期进行输出。从GF v1.12
版本开始,glog
组件也支持对日志文件进行滚动切分的特性,该特性涉及到日志对象配置属性中的以下几个配置项:
RotateSize int64 // Rotate the logging file if its size > 0 in bytes. RotateExpire time.Duration // Rotate the logging file if its mtime exceeds this duration. RotateBackupLimit int // Max backup for rotated files, default is 0, means no backups. RotateBackupExpire time.Duration // Max expire for rotated files, which is 0 in default, means no expiration. RotateBackupCompress int // Compress level for rotated files using gzip algorithm. It's 0 in default, means no compression. RotateCheckInterval time.Duration // Asynchronizely checks the backups and expiration at intervals. It's 1 hour in default.
简要说明:
RotateSize
用于设置滚动切分时按照文件大小进行切分,该属性的单位为字节。只有当该属性值大于0时才会开启滚动切分的特性。RotateExpire
用于设置滚动切分时按照文件超过一定时间没有修改时进行切分。只有当该属性值大于0时才会开启滚动切分的特性。RotateBackupLimit
用于设置滚动切分的保留文件数,默认为0表示不保留,往往该值需要设置大于0。超过该保留文件数的切分文件将会按照从旧到新进行删除。RotateBackupExpire
用于设置按照过期时间进行清理。当切分文件超过指定的时间时将会被删除。RotateBackupCompress
用于设置切分文件的压缩级别,默认为0表示不压缩。该压缩级别的取值范围为1-9
,其中9
为最大压缩级别。RotateCheckInterval
用于设置定时器的定时检测间隔,默认为1小时,往往不需要设置。
功能开启
从以上滚动切分的配置项可以看到,仅有当RotateSize
或者RotateExpire
配置项被设置时才会生效,默认情况下是关闭的。
文件格式
glog
组件的日志输出文件固定格式为*.log
,即使用.log
作为日志文件名后缀。为方便统一规范管理,切分文件的格式也是固定的,开发者无法自定义。当日志文件被滚动切分时,当前被切分的日志文件将会按照”*.切分时间.log
“的格式进行重命名。其中切分时间
的格式为:年月日时分秒毫秒微秒
,例如:
access.log -> access.20200326101301899002.log access.20200326.log -> access.20200326.20200326101301899002.log
配置示例
示例1,按照日志文件大小进行滚动切分:
logger: Path: "/var/log" Level: "all" Stdout: false RotateSize: "100M" RotateBackupLimit: 2 RotateBackupExpire: "7d" RotateBackupCompress: 9
简要说明:
- 可以看到
RotateSize
配置项在配置文件中支持使用字符串的形式进行设置,例如:100M
,200MB
,500KB
,1Gib
等等,在该示例中,我们设置日志文件大小超过100M
时进行切分。 - 同时,
RotateBackupExpire
的配置项也支持字符串配置,例如:1h
,30m
,1d6h
,7d
等等,在该示例中,我们设置切分文件的过期时间为7d
,即七天后会自动删除该切分文件。 - 这里通过设置
RotateBackupCompress
为9
表示使用最大的压缩级别,使得切分后的文件最小化存储。但是需要注意,切分和压缩是两个不同的操作,文件压缩是一个异步操作,因此当文件被自动切分后,定时器通过一定的时间间隔定期检查后再自动将其压缩为*.gz
文件。压缩级别设置得越高,会更多使用CPU
资源。
- 可以看到
示例2,按照日志文件修改过期进行滚动切分:
logger: Path: "/var/log" Level: "all" Stdout: false RotateExpire: "1d" RotateBackupLimit: 1 RotateBackupExpire: "7d" RotateBackupCompress: 9
在这里,我们设置
RotateExpire
为1d
表示当某个日志文件超过一天都没有任何修改/写入时,glog
模块将会自动将其进行滚动切分。同时进行压缩存储。
注意事项
由于不同的日志对象可能有不同的滚动切分配置,假如多个日志对象的日志目录为同一个,并且都开启了滚动切分特性,那么多个日志对象的滚动切分配置项会冲突,会有意想不到的结果。因此,我们建议您两个选择:
- 全局使用同一个默认的日志单例对象(
g.Log()
),通过Cat
或File
方法设置输出日志文件到不同的目录或文件名。 - 将不同日志对象(
g.Log(名称)
)的输出目录(Path
配置项)设置为不同的文件目录,并且多个日志对象的日志目录不存在相互的层级关系。
例如: 我们有两类业务日志文件order
和promo
,分别对应订单业务和促销业务,我们先假定他们属于同一个服务程序中。
假如日志路径为/var/log
,我们可以:
- 通过
g.Log().Cat("order").Print(xxx)
输出订单日志。生成的日志文件例如:/var/log/order/2020-03-26.log
。 - 通过
g.Log().Cat("promo").Print(xxx)
输出促销日志。生成的日志文件例如:/var/log/promo/2020-03-26.log
。
也可以通过:
- 通过
g.Log("order").Print(xxx)
输出订单日志。生成的日志文件例如:/var/log/order.log
。 - 通过
g.Log("order").Print(xxx)
输出促销日志。生成的日志文件例如:/var/log/promo.log
。
Content Menu
- No labels
11 Comments
54yuri
感觉这个日志切分功能非常让人困惑,比如我想保留最近3天生成的日志,RotateBackupExpire 如果设置成24*time.Hour 其实切割不了,因为文件名按照天来割{y-m-d.log},已经是不同文件。
比如生成了 2020-03-26.log , 2020-03-27.log , 2020-03-28.log , 现在 2020-03-29.log , 按理来说我想删掉 2020-03-26.log,RotateBackupLimit = 3 貌似并不能解决
郭强
默认的文件格式是
{y-m-d}.log
,你可以修改这个文件格式为同一个文件,不用按照日期区分。54yuri
还有希望加入软连接功能 , 比如xxx.log 自动指向 最新的 xxx.2020-03-29.log, 这样也方便查看。
FLY的狐狸
这个功能还是很实用的,加入个“实验性特性”让人望而却步,GF太强大了啥都有~!~
tomdog
切分文件的格式也是固定的,开发者无法自定义。当日志文件被滚动切分时,当前被切分的日志文件将会按照”
*.切分时间.log
“的格式进行重命名关于这一点, 感觉太长了, 比如我要保留最近n个的, 比较早的文件名就变成了, 如下这样. 如果n比较大, 则文件名会异常的长.
xxxx.20220106173812657119.20220106173912865714.20220106174012855549.20220106174112858528.20220106174213156742.20220106174313257751.20220106174413257845.20220106174513255314.20220106174613460733.20220106174713456431.log
白夜
我也遇到了,可以解决么?
白夜
郭强 这个长长的名字有办法处理么?
郭强
tomdog 白夜 提个
issue
记录下呢,我最近处理issue
都没看到这个,不然早就处理了。tomdog
郭强 https://github.com/gogf/gf/issues/1672 , 感谢强哥. 后面发现问题, 大家及时提issue记录.
jiftle
自动清理日志,只保留最近7天的日志,应该如何设置?
wyy
按时间切割及按文件大小切割可以同时支持么