在 Debian 上“分割 Golang 日志”通常有几种场景,下面按最常见做法给你说明,你可以按需选择。
lumberjack(最常用)Golang 程序里直接集成日志轮转,不依赖系统。
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, // 天
Compress: true, // 压缩
})
log.Println("hello")
}
✅ 优点:跨平台、可控、Debian 无关
❌ 需要改代码
logrotate(最省事)如果你 Golang 程序只是写文件(如 /var/log/myapp.log):
sudo nano /etc/logrotate.d/myapp
示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
⚠️ 关键参数
copytruncate:Golang 不重开文件时必须用SIGHUP 重新打开日志sudo logrotate -d /etc/logrotate.d/myapp # 模拟
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
✅ 优点:不改代码
❌ 依赖外部调度
logInfo := log.New(os.OpenFile("info.log", ...))
logError := log.New(os.OpenFile("error.log", ...))
或使用 zap / logrus:
InfoLogger, ErrorLoggerHook如果是 systemd 服务:
[Service]
StandardOutput=journal
StandardError=journal
查看:
journalctl -u myapp.service
✅ 不用管文件
❌ 不是“文件分割”
| 问题 | 原因 | 解决 |
|---|---|---|
| 日志不轮转 | 没 copytruncate |
加参数 |
| 磁盘爆满 | 没 MaxBackups |
限制数量 |
| 权限错误 | /var/log 无写权限 |
www-data / debian 用户 |
lumberjacklogrotate + copytruncatejournald如果你愿意,可以告诉我:
我可以给你直接可用的配置。