温馨提示×

怎样轮转Debian Golang日志

小樊
39
2026-10-10 01:53:49
栏目: 编程语言

在 Debian 上“轮转 Golang 日志”通常有两层意思,下面分别说明常见做法。


一、Golang 程序本身的日志轮转(推荐在应用层处理)

如果你是用 Go 写的服务(如 log、log/slog、zap、logrus 等),最规范的做法是让程序支持日志轮转,而不是依赖系统。

1. 使用 lumberjack(最常用)

import (
    "gopkg.in/natefinch/lumberjack.v2"
    "log"
)

func main() {
    log.SetOutput(&lumberjack.Logger{
        Filename:   "/var/log/myapp/app.log",
        MaxSize:    10,   // MB
        MaxBackups: 7,
        MaxAge:     30,   // days
        Compress:   true,
    })
}

特点:

  • 自动切分
  • 自动压缩
  • 不依赖外部工具

2. 使用 zap + lumberjack

wc := zapcore.AddSync(&lumberjack.Logger{
    Filename:   "/var/log/myapp/app.log",
    MaxSize:    50,
    Compress:   true,
})

二、系统级日志轮转(Debian 标准方式:logrotate)

如果你的 Go 程序直接写文件(如 /var/log/myapp.log),用 logrotate 管理。

1. 创建 logrotate 配置

sudo nano /etc/logrotate.d/myapp

示例:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    copytruncate
}

2. 关键参数说明

  • copytruncate:非常重要,避免 Go 程序因文件句柄不释放而继续写旧文件
  • daily / weekly:轮转周期
  • rotate N:保留份数
  • compress:压缩旧日志

3. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp   # 模拟
sudo logrotate -f /etc/logrotate.d/myapp   # 强制执行

三、systemd 服务日志(如果你用 journald)

如果 Go 程序直接输出到 stdout:

# /etc/systemd/system/myapp.service
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal

查看:

journalctl -u myapp

journald 自带轮转(由 SystemMaxUse 控制)。


四、推荐方案总结

场景 推荐方式
Go 服务长期运行 lumberjack
简单脚本 / legacy logrotate + copytruncate
容器 / systemd stdout + journald

如果你愿意,可以告诉我:

  • Go 用的日志库
  • 日志写文件还是 stdout
  • 是否 systemd 管理

我可以给你一份可直接用的配置。

0 踩