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日志、应用日志,生成访问统计报表。