温馨提示×

CentOS Golang日志清理策略是什么

小樊
41
2025-12-25 11:32:25
栏目: 编程语言

CentOS 上 Golang 日志清理策略

策略总览

  • CentOS 上,常见的清理策略有两类:
    1. 使用系统级的 logrotate 对日志文件按大小或时间轮转并自动清理;
    2. 在应用内集成 lumberjack 等库,按文件大小、备份数量与保留天数自动轮转与压缩。二者也可结合使用(例如应用内按大小滚动,系统侧再做时间/数量清理)。

方案一 使用 logrotate 统一管理

  • 适用场景:多服务统一治理、容器外运行、希望与系统运维流程一致。
  • 基本思路:在 /etc/logrotate.d/ 为应用创建配置,定义轮转频率、保留份数、压缩与权限等策略,由系统定时任务执行。
  • 示例配置(/etc/logrotate.d/myapp):
    /var/log/myapp/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0640 myapp myapp
        copytruncate
    }
    
    • 关键指令说明:
      • daily:按天轮转;也可用 size 100M 按大小触发。
      • rotate 7:保留最近 7 个归档。
      • compress:对旧日志进行 gzip 压缩。
      • missingok:日志文件不存在时不报错。
      • notifempty:空文件不轮转。
      • create 0640 myapp myapp:轮转后新建文件的权限与属主。
      • copytruncate:复制当前日志后截断原文件,避免应用重新打开文件句柄(适合不支持信号重新打开日志的程序)。
  • 验证与调试:
    • 手动测试:logrotate -d /etc/logrotate.d/myapp(干跑)
    • 强制执行:logrotate -f /etc/logrotate.d/myapp
  • 提示:CentOS 默认通过 cron 每日运行 logrotate,无需额外添加定时任务。

方案二 应用内轮转 lumberjack

  • 适用场景:容器化部署、希望应用自包含、减少外部依赖。
  • 基本思路:在 Go 程序中将 lumberjack.Logger 作为输出,配置按大小滚动、保留数量与天数,并可压缩归档。
  • 示例代码(使用 zap + lumberjack):
    package main
    
    import (
        "go.uber.org/zap"
        "go.uber.org/zap/zapcore"
        "gopkg.in/natefinch/lumberjack.v2"
    )
    
    func main() {
        logger := zap.NewProduction()
        defer logger.Sync()
    
        lumber := &lumberjack.Logger{
            Filename:   "/var/log/myapp/app.log",
            MaxSize:    10,     // 单个文件最大 10 MB
            MaxBackups: 7,      // 最多保留 7 个备份
            MaxAge:     30,     // 最多保留 30 天
            Compress:   true,   // 启用压缩
        }
        defer lumber.Close()
    
        core := zapcore.NewCore(
            zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
            zapcore.AddSync(lumber),
            zapcore.InfoLevel,
        )
        sugared := zap.New(core).Sugar()
        sugared.Info("hello, this goes through lumberjack")
    }
    
  • 说明:lumberjack 负责按 MaxSize/MaxBackups/MaxAge 滚动与清理,适合在 Docker/K8s 中避免挂载复杂 logrotate 配置。

方案三 systemd 与 journald 的日志清理

  • 适用场景:应用以 systemd 服务运行,日志输出到 journald
  • 基本思路:使用 journalctl 管理日志保留时间或占用空间,避免 systemd 日志无限增长。
  • 常用命令:
    • 按时间清理:sudo journalctl --vacuum-time=2weeks
    • 按容量清理:sudo journalctl --vacuum-size=100M
    • 查看服务日志:sudo journalctl -u myapp.service -n 100
  • 提示:若应用直接写文件而非 journald,上述命令不会影响你的应用日志文件。

策略选择建议

  • 容器或云原生场景:优先在应用内使用 lumberjack,减少外部依赖与挂载复杂度。
  • 物理机/虚拟机多服务:优先用 logrotate 统一治理,便于与系统运维策略一致。
  • 使用 systemd 的场景:同时配置 journald 保留策略,避免系统日志膨胀。
  • 无论采用哪种方式,建议开启压缩、合理设置保留天数/数量,并定期校验配置有效性(如 logrotate -d/-f)。

0