CentOS上Golang日志管理怎么做
小樊
36
2025-12-21 09:50:54
CentOS 上 Golang 日志管理实践
一 方案总览
- 在 CentOS 上,建议将日志分为三层:
- 应用内日志(选择 log / logrus / zap / slog(Go 1.21+));
- 本地轮转与保留(使用 logrotate 或库内轮转);
- 集中化与检索(使用 rsyslog/journald 收集,或接入 ELK 等)。
- 常见取舍:结构化与检索优先选 JSON + zap/logrus;极致性能优先 zap/zerolog;简单场景用 标准库 log 即可。
二 应用内日志库选择与示例
- 标准库 log(简单直接)
- 要点:设置输出、前缀与标志位(时间、文件名、行号)。
- 示例:
- 打开或创建日志文件:logFile, _ := os.OpenFile(“myapp.log”, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
- 设置输出与格式:log.SetOutput(logFile); log.SetPrefix("myapp: "); log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
- logrus(结构化、插件丰富)
- 要点:可输出 JSON 或文本,支持 Hook、字段化。
- 示例:
- 初始化:logger := logrus.New(); logger.SetFormatter(&logrus.JSONFormatter{}); logger.SetLevel(logrus.InfoLevel)
- 写入:logger.WithFields(logrus.Fields{“number”: 42}).Info(“started”)
- zap(高性能、生产推荐)
- 要点:提供 NewProduction/NewDevelopment,可自定义 Encoder/Level/Output。
- 示例:
- 生产:logger, _ := zap.NewProduction(); defer logger.Sync(); logger.Info(“hello”, zap.String(“svc”, “api”))
- 补充:Go 1.21+ 可用 slog,统一结构化日志接口,便于替换与演进。
三 本地日志轮转与保留
- 使用系统 logrotate(推荐与系统一致,运维成本低)
- 新建配置:/etc/logrotate.d/myapp
- 示例:
- /var/log/myapp/*.log {
- daily
- rotate 7
- compress
- missingok
- notifempty
- copytruncate
- }
- 生效与测试:systemctl enable --now rsyslog; logrotate -f /etc/logrotate.d/myapp
- 提示:若应用持有文件句柄,优先用 copytruncate,避免重启应用。
- 使用库内轮转(应用自管理,便于容器化)
- 以 lumberjack 配合 zap/logrus:
- 示例(zap + lumberjack):
- import “gopkg.in/natefinch/lumberjack.v2”
- core := zapcore.NewCore(
- zapcore.NewJSONEncoder(zap.NewEncoderConfig()),
- zapcore.AddSync(&lumberjack.Logger{
- Filename: “./logs/app.log”,
- MaxSize: 10, // MB
- MaxBackups: 3,
- MaxAge: 28, // 天
- Compress: true,
- }),
- zap.InfoLevel)
- 优点:按大小/时间自动切割、压缩与保留;缺点:需应用自行管理生命周期。
四 与系统日志集成与集中化
- 写入 systemd Journal(适合服务托管)
- 将应用作为 systemd 服务运行,使用 StandardOutput=journal、StandardError=journal,通过 journalctl -u your.service 查看;无需自行轮转,由 journald 管理。
- 通过 rsyslog 集中(适合多实例/物理机)
- 启用 UDP/TCP 514 接收,应用用 syslog 写入;在 /etc/rsyslog.d/ 配置过滤与落盘,统一由 logrotate 管理。
- 示例(启用网络接收):
- /etc/rsyslog.conf 中加载模块:ModLoad imudp; UDPServerRun 514; ModLoad imtcp; InputTCPServerRun 514
- 重启:systemctl restart rsyslog
- 接入 ELK(适合检索与可视化)
- 应用以 JSON 输出,经 Logstash 入 Elasticsearch,用 Kibana 展示与告警。
五 生产实践清单
- 日志级别:开发 Debug,生产 Info/Warn;通过 AtomicLevel/SetLevel 动态调节,避免频繁重启。
- 结构化与字段:统一包含 ts、level、msg、caller、trace_id/span_id 等关键字段,便于检索与链路追踪。
- 性能与可靠性:高并发优先 zap/zerolog;必要时采用 异步/批量 写入;关键路径使用 logger.Sync() 刷盘;对 panic 使用 recover 记录堆栈。
- 运维与合规:统一目录与权限(如 /var/log/myapp/,权限 0644);按日/大小轮转并压缩;对外落盘前脱敏;容器化场景优先 stdout + 采集器(如 filebeat)。