温馨提示×

debian golang日志如何轮转

小樊
33
2026-09-01 05:42:11
栏目: 编程语言

在 Debian 上,Golang 程序本身的日志不会自动轮转,需要借助外部工具日志库来实现。常见做法有下面几种:


一、使用系统工具 logrotate(最推荐)

这是 Debian 上最标准、最省心的方式。

1. 让 Golang 写文件日志

log.SetOutput(os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644))

2. 配置 logrotate

新建配置文件:

sudo vim /etc/logrotate.d/myapp

示例:

/var/log/myapp.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

说明:

  • copytruncate:复制后清空原文件(适合不能重启的 Go 程序
  • 如果不加 copytruncate,需要 Go 程序支持信号重启(如 SIGHUP

3. 测试

sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp

二、使用 Go 日志库自带的轮转(无需系统依赖)

1. 使用 lumberjack

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

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

✅ 优点:

  • 纯 Go 实现
  • 不需要 logrotate
  • 适合容器 / systemd 环境

三、使用 systemd + journald(Debian 10+)

如果你用 systemd 启动 Go 程序:

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

查看日志:

journalctl -u myapp

journald 自带日志轮转(由 /etc/systemd/journald.conf 控制)


四、对比建议

方案 适用场景
logrotate 传统服务器、长期运行
lumberjack 容器、微服务
journald systemd 环境

如果你愿意,我可以:

  • 给你一个 完整 Go + logrotate 示例
  • 或针对 Docker / Kubernetes 场景给方案

0