前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 语言三方库 lumberjack 日志切割组件怎么使用?

Golang 语言三方库 lumberjack 日志切割组件怎么使用?

作者头像
frank.
发布2021-02-07 11:44:23
8.3K0
发布2021-02-07 11:44:23
举报
文章被收录于专栏:Golang语言开发栈

01

介绍

Golang 语言标准库的 log 包不支持日志切割,然而如果我们业务每天产生海量日志,日志文件就会越来越大,甚至会触发磁盘空间不足的报警,此时如果我们移动或者删除日志文件,需要先将业务停止写日志,很不方便。

而且大日志文件也不方便查询,多少有点失去日志的意义。在实际业务开发中,我们通常会按照日志文件大小或者日期进行日志切割。

常见的日志切割方式是由系统 Crontab 计划任务执行 Shell 文件进行日志切割或者由业务本身进行日志切割。

Golang 语言三方库 lumberjack 的作用就是进行日志切割,下面我们来介绍一下 lumberjack。

02

lumberjack 使用

lumberjack 提供了一个滚动记录器 logger,它是一个控制写入日志的文件的日志组件,目前最新版本是 v2.0,需要使用 gopkg.in 导入。

安装方式:

代码语言:javascript
复制
go get -u github.com/natefinch/lumberjack

导入方式:

代码语言:javascript
复制
import "gopkg.in/natefinch/lumberjack.v2"

要将 lumberjack 与标准库的 log 包一起使用,只需在应用程序启动时将它传递到 SetOutput 函数。

示例代码:

代码语言:javascript
复制
log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/myapp/foo.log",
    MaxSize:    500, // megabytes
    MaxBackups: 3,
    MaxAge:     28, //days
    Compress:   true, // disabled by default
})

lumberjack 的 Logger 结构体,是一个写入指定文件的 io.WriteCloser。Logger 在第一次写入时打开或创建日志文件。如果文件存在且小于 MaxSize 的值,lumberjack 将打开并追加到该文件。如果文件存在且其 size 的值为大于等于 MaxSize,文件通过将当前时间作为文件名的一部分进行重命名文件,然后使用原始文件名创建新的日志文件。

每当写入会导致当前日志文件超过 MaxSize 的值时,当前文件将关闭和重命名,并且使用原始名称创建的新日志文件。因此,您给 Logger 的文件名始终是当前日志文件。

备份使用给定给 Logger 的日志文件名,其中名称是没有扩展名的文件名,时间戳是日志与时间一起旋转的时间。时间格式是 2006-01-02T15-04-05.000,扩展是原始扩展。例如,如果您的 Logger.Filename 是 /var/log/foo/server.log,那么 2016 年 11 月 11 日下午 6:30 创建的备份将使用 filenam 是 /var/log/foo/server-2016-11-04T18-30-00.000.log

03

清理旧日志文件

每当创建新的日志文件时,旧日志文件可能会被删除。将保留根据编码时间戳保存的最新文件,文件数量最多等于 Maxbackups 的值,如果 Maxbackups 是 0,将删除所有文件。

无论 MaxBackups 值是什么,任何编码时间戳超过 MaxAge 值的文件都将被删除。

请注意,在时间戳中编码的时间是旋转时间,可能与上次写入该文件的时间不同。

如果 MaxBackups 和 MaxAge 都是 0,则不会删除任何旧日志文件。

04

Logger 方法

  • func (l *Logger) Close() error
  • func (l *Logger) Rotate() error
  • func (l *Logger) Write(p []byte) (n int, err error)

其中 Close 替代 io.Closer,关闭当前日志文件。

其中 Rotate 会导致记录器关闭现有日志文件并立即创建新日志文件。对于想要在正常 rotation 规则之外启动 rotation 的应用程序,这是一个 helper 函数,例如对 SIGHUP 的回应。

执行 Rotate 方法后,这将根据正常规则启动旧日志文件的清理。

示例代码:如何执行 Rotate 方法后,以响应 SIGHUP 的示例。

代码语言:javascript
复制
l := &lumberjack.Logger{}
log.SetOutput(l)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP)

go func() {
    for {
        <-c
        l.Rotate()
    }
}()

其中 Write 替代 io.Writer,如果写入会导致日志文件大于 MaxSize 的值,将关闭文件,重命名文件为包含当前时间的时间戳,并使用原始日志文件名创建新的日志文件。

如果写入长度大于 MaxSize 的值,则返回错误。

05

总结

本文主要是介绍三方库 lumberjack 日志切割组件,包括安装、导入和使用方法。通常在实际项目开发中,用于替代 io.Writer

参考资料:

https://github.com/natefinch/lumberjack

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档