在 Debian 上,Golang 程序本身的日志不会自动轮转,需要借助外部工具或日志库来实现。常见做法有下面几种:
这是 Debian 上最标准、最省心的方式。
log.SetOutput(os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644))
新建配置文件:
sudo vim /etc/logrotate.d/myapp
示例:
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
说明:
copytruncate:复制后清空原文件(适合不能重启的 Go 程序)copytruncate,需要 Go 程序支持信号重启(如 SIGHUP)sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
lumberjackimport (
"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,
})
}
✅ 优点:
如果你用 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 环境 |
如果你愿意,我可以: