CentOS环境下Golang日志存储策略
Golang原生log
包仅提供基础日志功能,生产环境建议使用第三方库增强能力:
/var/log/myapp.log
),确保存储路径存在且有写入权限(如chmod 755 /var/log
);logrus
时,可通过JSONFormatter
配置:logrus.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
或使用zap
的JSONEncoder
:encoderConfig := zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
encoder := zapcore.NewJSONEncoder(encoderConfig)
日志轮转可避免单个文件过大占用磁盘空间,常用方案有两种:
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志文件路径
MaxSize: 100, // 单个文件最大100MB
MaxBackups: 7, // 保留最近7个旧文件
MaxAge: 30, // 保留最近30天
Compress: true, // 压缩旧文件(gzip)
})
/etc/logrotate.d/myapp
配置文件:/var/log/myapp.log {
daily # 每天轮转
rotate 7 # 保留7个旧文件
compress # 压缩旧文件
missingok # 文件不存在不报错
notifempty # 文件为空不轮转
create 0640 root root # 新文件权限与所有者
sharedscripts # 所有日志处理完再执行脚本
postrotate
systemctl restart myapp.service # 轮转后重启应用(可选)
endscript
}
根据环境设置不同日志级别,减少不必要的日志输出:
DebugLevel
,输出详细调试信息;InfoLevel
,输出关键流程信息;WarnLevel
或ErrorLevel
,仅输出警告和错误信息(避免日志爆炸)。logrus
):if env == "production" {
logrus.SetLevel(logrus.WarnLevel)
} else {
logrus.SetLevel(logrus.DebugLevel)
}
将日志发送到集中式系统,便于统一存储、分析与报警:
logrus
发送日志到Logstash):hook, err := logrustash.NewHook("tcp://localhost:5000", "myapp")
if err == nil {
logrus.AddHook(hook)
}
对日志进行实时监控,及时发现异常:
Prometheus
+Grafana
监控日志文件大小、数量、写入速率等指标;Alertmanager
设置报警规则(如错误日志超过阈值),通过邮件、短信或钉钉通知管理员;goaccess
分析Nginx日志、应用日志,生成访问统计报表。