日志轮转可防止日志文件过大,提升维护效率。使用lumberjack库可按大小或时间自动切割日志,支持压缩与备份,结合标准log包实现简单高效。

在Golang初级项目中,日志轮转与管理是保障程序可维护性和问题排查效率的重要环节。很多初学者直接使用
log
不进行日志轮转的程序容易产生单个巨大的日志文件,带来以下问题:
日志轮转通过按文件大小或时间周期自动切割日志,并支持压缩旧日志、保留指定数量的备份文件,有效解决上述问题。
在Go生态中,
lumberjack
io.Writer
log
zap
立即学习“go语言免费学习笔记(深入)”;
安装 lumberjack:go get gopkg.in/natefinch/lumberjack.v2
package main
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 配置 lumberjack 作为日志写入器
logger := &lumberjack.Logger{
Filename: "logs/app.log", // 日志文件路径
MaxSize: 10, // 每个日志文件最大 10MB
MaxBackups: 5, // 最多保留 5 个旧文件
MaxAge: 7, // 文件最多保存 7 天
Compress: true, // 启用 gzip 压缩旧日志
}
defer logger.Close()
// 设置标准 log 输出到 lumberjack
log.SetOutput(logger)
// 模拟写入日志
for i := 0; i < 1000; i++ {
log.Printf("这是第 %d 条日志", i)
}
}
当
app.log
lumberjack
app.log.1
app.log
对于稍复杂的项目,推荐使用
uber-go/zap
lumberjack
package main
import (
"gopkg.in/natefinch/lumberjack.v2"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
// 配置 lumberjack
writeSyncer := zapcore.AddSync(&lumberjack.Logger{
Filename: "logs/app_structured.log",
MaxSize: 10,
MaxBackups: 5,
MaxAge: 7,
Compress: true,
})
// 构建 zap 日志核心
encoderCfg := zap.NewProductionEncoderConfig()
encoderCfg.TimeKey = "ts"
encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderCfg),
writeSyncer,
zap.InfoLevel,
)
logger := zap.New(core)
defer logger.Sync()
// 写入结构化日志
logger.Info("用户登录", zap.String("user", "alice"), zap.String("ip", "192.168.1.100"))
}
这种方式输出的是JSON格式日志,便于后续被ELK等系统采集分析。
运行前确保日志目录存在,避免因路径不存在导致写入失败。
import "os"
func ensureLogDir() {
if err := os.MkdirAll("logs", 0755); err != nil {
log.Fatal("无法创建日志目录:", err)
}
}
在程序启动初期调用
ensureLogDir()
基本上就这些。对于初级Go项目,使用
lumberjack
log
zap
以上就是Golang初级项目中日志轮转与管理实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号