温馨提示×

Linux下Golang日志清理策略

小樊
35
2025-11-15 15:25:38
栏目: 编程语言

Linux下Golang日志清理策略

一 策略总览与选型

  • 生产环境常用三类方案:
    1. 系统级工具 logrotate(统一管理、无需改代码);
    2. 应用内置轮转 lumberjack(随应用部署、配置即生效);
    3. 容器/服务场景用 systemd journald 管理标准输出日志。
  • 选型建议:
    • 传统部署或需集中管理多服务日志时,优先用 logrotate
    • 希望将日志策略随二进制交付、减少外部依赖时,用 lumberjack
    • 使用 systemd 管理的服务,优先用 journald,避免重复落盘与轮转冲突。

二 使用 logrotate 的系统级清理

  • 典型配置(写入 /etc/logrotate.d/my-golang-app):
    /var/log/myapp/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0640 root adm
        copytruncate
    }
    
    • 关键参数说明:
      • daily:按天轮转;rotate 7:保留最近 7 份;compress:压缩旧日志;
      • missingok:日志不存在不报错;notifempty:空文件不轮转;
      • create 0640 root adm:新建文件权限与属主;
      • copytruncate:复制后截断原文件,避免应用持有文件句柄(适合不支持重新打开日志的程序)。
  • 测试与生效:
    • 手动强制执行一次:sudo logrotate -f /etc/logrotate.d/my-golang-app
    • 验证配置语法:sudo logrotate -d /etc/logrotate.d/my-golang-app(dry-run)
  • 注意:若应用自行轮转(如 lumberjack),通常不使用 copytruncate,以免与 logrotate 策略冲突。

三 应用内置轮转 lumberjack

  • 安装:go get gopkg.in/natefinch/lumberjack.v2
  • 使用示例(标准库 log):
    package main
    
    import (
        "log"
        "gopkg.in/natefinch/lumberjack.v2"
    )
    
    func main() {
        log.SetOutput(&lumberjack.Logger{
            Filename:   "/var/log/myapp.log", // 日志路径
            MaxSize:    10,                  // 单个文件最大 10 MB
            MaxBackups: 7,                  // 最多保留 7 个备份
            MaxAge:     30,                  // 备份最长保留 30 天
            Compress:   true,                // 启用压缩
        })
        log.Println("hello, rotating logs")
    }
    
  • 与结构化日志库(如 zap)配合:将 lumberjack.Logger 作为 zap 的 WriteSyncer 使用,同样可控制按大小/天数/数量清理。

四 容器与服务场景的日志管理

  • 使用 systemd 管理的服务:
    • 建议将日志输出到 stdout/stderr,由 journald 统一采集与轮转;
    • 清理旧日志:sudo journalctl --vacuum-time=2weeks(保留最近两周);
    • 查看服务日志:sudo journalctl -u myapp.service -n 100
  • 容器化(Docker/K8s):优先使用 stdout/stderr + 容器运行时日志驱动(如 json-file、journald),由宿主机或集群的日志采集系统统一轮转与归档,避免在容器内自行轮转导致采集遗漏。

五 清理策略与运维建议

  • 保留策略建议:按大小(如单文件 10 MB)+ 时间(如 30 天)+ 数量(如 7 个)的组合控制,既防暴涨又保留足够排障历史。
  • 避免误删:不要直接 rm 正在写入的日志;使用 logrotatecopytruncate 或让应用重新打开日志文件;必要时先停止写入或使用信号通知。
  • 权限与安全:日志目录与文件建议设置为仅服务账号可写,如 0640 root adm;多用户环境避免日志被非授权读取。
  • 监控与告警:对日志目录设置 磁盘使用率 告警;定期做 logrotate 配置演练与回滚演练,确保策略生效与可用。

0