温馨提示×

CentOS上Golang日志管理怎么做

小樊
36
2025-12-21 09:50:54
栏目: 编程语言

CentOS 上 Golang 日志管理实践

一 方案总览

  • CentOS 上,建议将日志分为三层:
    1. 应用内日志(选择 log / logrus / zap / slog(Go 1.21+));
    2. 本地轮转与保留(使用 logrotate 或库内轮转);
    3. 集中化与检索(使用 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=journalStandardError=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 输出,经 LogstashElasticsearch,用 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)。

0