温馨提示×

CentOS Golang日志的清理策略

小樊
31
2025-12-07 17:51:16
栏目: 编程语言

CentOS 上 Golang 日志的清理策略

策略总览与选择

  • CentOS 上,常见的清理策略有两类:
    1. 使用系统级的 logrotate 统一管理日志轮转与清理;
    2. 在应用内集成 lumberjack 实现按大小/时间自动轮转与压缩。
  • 选择建议:
    • 已有大量服务、希望集中运维与审计时,优先用 logrotate
    • 容器化/不可变基础设施或希望与应用强绑定时,优先用 lumberjack
  • 若服务由 systemd 托管,也可结合 journald 管理标准输出日志,与文件日志并行使用。

方案一 logrotate 系统级清理

  • 典型配置(放置于 /etc/logrotate.d/myapp):
    /var/log/myapp/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0640 myapp myapp
        sharedscripts
        postrotate
            systemctl reload myapp.service >/dev/null 2>&1 || true
        endscript
    }
    
    • 关键参数说明:
      • daily:按天轮转;rotate 7:保留最近 7 份;compress:gzip 压缩旧日志;delaycompress:下次轮转再压缩当前旧文件;
      • missingok:日志不存在不报错;notifempty:空文件不轮转;
      • create 0640 myapp myapp:轮转后新建文件的权限与属主;
      • postrotate:轮转后可执行重载,确保应用继续写入新文件(按需选择 reload/restart)。
  • 测试与生效:
    • 语法与模拟运行:sudo logrotate -d /etc/logrotate.d/myapp
    • 强制执行一次:sudo logrotate -f /etc/logrotate.d/myapp
  • 运行保障:logrotate 通常由 crond 按日定时执行(系统自带),无需额外添加计划任务。

方案二 应用内轮转 lumberjack

  • 适用于将轮转策略内置于 Go 程序,便于在容器和不可变环境中自包含运行。
  • 代码示例(使用 natefinch/lumberjack):
    package main
    
    import (
        "log"
        "gopkg.in/natefinch/lumberjack.v2"
    )
    
    func main() {
        logger := log.New(&lumberjack.Logger{
            Filename:   "/var/log/myapp/app.log", // 日志路径
            MaxSize:    10,                     // 单个文件最大 10MB
            MaxBackups: 7,                      // 最多保留 7 个备份
            MaxAge:     30,                     // 备份最长保留 30 天
            Compress:   true,                   // 启用压缩
        }, "", log.LstdFlags)
    
        logger.Println("hello, this is a rolling log")
    }
    
  • 要点:
    • 通过 MaxSize/MaxBackups/MaxAge/Compress 控制容量与保留周期;
    • 程序重启后策略仍然有效;
    • 若多进程/多实例写同一文件,需确保外部同步或使用进程安全的写入方案。

systemd 场景的补充

  • 若应用仅输出到 stdout/stderr,可用 journald 管理并按时间清理:
    • 查看日志:sudo journalctl -u myapp.service -n 100
    • 按时间清理:sudo journalctl --vacuum-time=2weeks
  • 建议同时限制日志总量,避免无限增长:在 /etc/systemd/journald.conf 中设置如 SystemMaxUse=100M,然后执行 sudo systemctl restart systemd-journald

容量规划与最佳实践

  • 明确保留目标:例如按容量(保留最近 N 天或最近 M 个文件)与合规要求设定阈值;
  • 双轨制:业务日志走文件(logrotate 或 lumberjack),关键事件同时上报到 journald 或集中式日志平台;
  • 避免直接删除正在写入的日志文件,优先使用轮转(rename + create)或信号通知应用重新打开日志;
  • 定期演练与监控:对 logrotate 配置做干跑测试,并对日志目录设置 磁盘告警容量阈值

0