golang实现简单滚动日志记录的插件库lumberjack的使用
golang实现简单滚动日志记录的插件库lumberjack的使用
Lumberjack是一个用于将日志写入滚动文件的Go包。它是日志基础设施中的一个可插拔组件,控制日志写入的文件。
安装
使用v2.0版本,导入方式如下:
import "gopkg.in/natefinch/lumberjack.v2"
基本使用
要与标准库的log包一起使用,只需在应用程序启动时将其传递给SetOutput函数:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/foo.log", // 日志文件路径
MaxSize: 500, // 文件最大大小(MB)
MaxBackups: 3, // 保留的旧日志文件最大数量
MaxAge: 28, // 保留旧日志文件的最大天数
Compress: true, // 是否压缩旧日志文件(默认false)
})
Logger结构体
Logger是一个实现了io.WriteCloser接口的结构体,它会写入指定的文件。
type Logger struct {
// 要写入的日志文件路径
Filename string `json:"filename" yaml:"filename"`
// 日志文件旋转前的最大大小(MB),默认为100MB
MaxSize int `json:"maxsize" yaml:"maxsize"`
// 基于文件名中时间戳保留旧日志文件的最大天数
MaxAge int `json:"maxage" yaml:"maxage"`
// 要保留的旧日志文件最大数量
MaxBackups int `json:"maxbackups" yaml:"maxbackups"`
// 是否使用本地时间而非UTC时间
LocalTime bool `json:"localtime" yaml:"localtime"`
// 是否压缩旧日志文件
Compress bool `json:"compress" yaml:"compress"`
}
方法
Close()
func (l *Logger) Close() error
Close实现了io.Closer接口,关闭当前日志文件。
Rotate()
func (l *Logger) Rotate() error
Rotate使Logger关闭现有日志文件并立即创建一个新文件。这是一个辅助函数,用于在正常轮换规则之外启动轮换。
示例:在收到SIGHUP信号时轮换日志
l := &lumberjack.Logger{}
log.SetOutput(l)
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGHUP)
go func() {
for {
<-c
l.Rotate()
}
}()
Write()
func (l *Logger) Write(p []byte) (n int, err error)
Write实现了io.Writer。如果写入会导致日志文件大于MaxSize,则关闭文件,重命名为包含当前时间戳,并使用原始日志文件名创建新的日志文件。
工作原理
- 首次写入时,会打开或创建日志文件
- 如果文件存在且小于MaxSize,会追加到该文件
- 如果文件存在且大小>=MaxSize,文件会被重命名(添加时间戳),并创建新的日志文件
- 备份文件使用
name-timestamp.ext
格式命名 - 当创建新日志文件时,会根据配置删除旧日志文件
清理旧日志文件
创建新日志文件时,可能会删除旧日志文件:
- 保留最近的MaxBackups个文件(如果MaxBackups为0则保留所有)
- 删除时间戳早于MaxAge天的文件(不考虑MaxBackups)
- 如果MaxBackups和MaxAge都为0,则不会删除任何旧日志文件
更多关于golang实现简单滚动日志记录的插件库lumberjack的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实现简单滚动日志记录的插件库lumberjack的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Lumberjack实现Golang滚动日志记录
Lumberjack是一个流行的Golang日志滚动库,它提供了自动日志文件轮转功能,可以基于文件大小、时间或两者结合来滚动日志文件。下面我将详细介绍如何使用Lumberjack。
Lumberjack基本特性
- 按文件大小滚动日志
- 保留最多N个旧日志文件
- 可选择压缩旧日志文件
- 支持日志文件清理
- 线程安全
安装Lumberjack
go get gopkg.in/natefinch/lumberjack.v2
基本使用示例
package main
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 配置Lumberjack日志滚动
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/foo.log", // 日志文件路径
MaxSize: 500, // 每个日志文件的最大大小(MB)
MaxBackups: 3, // 保留旧日志文件的最大数量
MaxAge: 28, // 保留旧日志文件的最大天数
Compress: true, // 是否压缩/归档旧日志文件
})
// 正常记录日志
for i := 0; i < 10000; i++ {
log.Println("这是一条测试日志,编号:", i)
}
}
与标准log库集成
package main
import (
"log"
"os"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 同时输出到控制台和文件
log.SetOutput(io.MultiWriter(os.Stdout, &lumberjack.Logger{
Filename: "app.log",
MaxSize: 100, // MB
MaxBackups: 5,
MaxAge: 30, // days
}))
log.Println("这条日志会同时出现在控制台和日志文件中")
}
与logrus集成示例
package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := logrus.New()
// 配置Lumberjack
logger.SetOutput(&lumberjack.Logger{
Filename: "logrus.log",
MaxSize: 100, // MB
MaxBackups: 5,
MaxAge: 30, // days
Compress: true,
})
logger.Info("这是一条logrus日志")
}
高级配置示例
package main
import (
"log"
"os"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 自定义日志轮转配置
lumberjackLogger := &lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 5, // 保留最多5个备份
MaxAge: 30, // 最多保存30天
LocalTime: true, // 使用本地时间
Compress: true, // 压缩旧日志
}
// 设置日志输出
log.SetOutput(lumberjackLogger)
// 程序退出前关闭日志文件
defer lumberjackLogger.Close()
// 日志记录
log.Println("应用程序启动")
// 模拟日志记录
for i := 0; i < 1000; i++ {
log.Printf("处理请求 #%d", i)
}
log.Println("应用程序关闭")
}
动态修改日志配置
package main
import (
"log"
"os"
"os/signal"
"syscall"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 初始化日志配置
logger := &lumberjack.Logger{
Filename: "dynamic.log",
MaxSize: 50,
MaxBackups: 3,
MaxAge: 7,
}
log.SetOutput(logger)
// 监听SIGHUP信号重新打开日志文件
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGHUP)
go func() {
for {
<-sigs
logger.Rotate() // 收到SIGHUP信号时轮转日志
log.Println("收到SIGHUP信号,日志已轮转")
}
}()
// 正常日志记录
for i := 0; ; i++ {
log.Printf("这是一条日志记录 #%d", i)
time.Sleep(time.Second)
}
}
注意事项
- Lumberjack不是异步的,日志写入会阻塞调用线程
- 在高并发场景下,建议结合缓冲写入器使用
- 确保应用程序对日志目录有写入权限
- 程序退出前最好调用Close()方法确保所有日志都写入文件
Lumberjack是一个简单而强大的日志滚动解决方案,适合大多数Golang应用的日志需求。对于更复杂的日志场景,可以考虑使用zerolog或zap等更高级的日志库,它们通常也支持与Lumberjack集成。