Linux环境下Golang日志优化存储
一 核心策略
二 日志轮转与归档
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
}
关键参数含义:daily(按天轮转)、rotate 7(保留 7 份)、compress(压缩旧日志)、delaycompress(下次轮转再压缩)、missingok(文件缺失不报错)、notifempty(空文件不轮转)、create(新建文件权限与属主)。测试可用:logrotate -f /etc/logrotate.d/myapp。import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10, // 单个文件最大 10MB
MaxBackups: 7, // 最多保留 7 个备份
MaxAge: 30, // 备份最长保留 30 天
Compress: true, // 启用压缩
})
三 性能与存储优化
四 集中式存储与分析
五 落地配置示例
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func newLogger() *zap.Logger {
cfg := zap.NewProductionConfig()
cfg.OutputPaths = []string{"/var/log/myapp/app.log"}
cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
logger, _ := cfg.Build()
return logger
}
配合 /etc/logrotate.d/myapp(见上文)实现按天轮转、保留 7 天、压缩归档。package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 10,
MaxBackups: 7,
MaxAge: 30,
Compress: true,
})
logrus.Info("started")
}
if $programname == 'myapp' then /var/log/myapp.log
& stop
重启 rsyslog:systemctl restart rsyslog;Go 侧输出到 stdout/stderr 即可被系统采集。