在 Debian 上用 Golang 写服务时,“日志归档”一般分两层来做:
下面给你几种常见、实用的方案。
Golang 生态里最经典的日志滚动库。
import (
"gopkg.in/natefinch/lumberjack.v2"
"log"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100, // MB
MaxBackups: 7,
MaxAge: 30, // 天
Compress: true,
})
log.Println("hello")
}
特点:
import (
"go.uber.org/zap"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
w := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log",
MaxSize: 100,
MaxBackups: 10,
MaxAge: 30,
Compress: true,
})
core := zapcore.NewCore(
zapcore.JSONEncoder(zap.NewProductionEncoderConfig()),
w,
zap.InfoLevel,
)
logger := zap.New(core)
logger.Info("start service")
}
如果你的 Golang 程序直接输出到文件(不自己切):
sudo apt install logrotate
sudo vim /etc/logrotate.d/myapp
示例:
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
copytruncate
}
说明:
copytruncate:不重启程序,直接截断日志(适合不支持信号的服务)compress:gzip 归档rotate 30:保留 30 天sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
如果你用 systemd 启动 Golang:
[Service]
ExecStart=/opt/myapp/myapp
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u myapp
归档由 systemd 自动管理:
sudo journalctl --vacuum-time=30d
| 场景 | 推荐方案 |
|---|---|
| 普通 Go 服务 | zap + lumberjack |
| 传统运维 | 输出文件 + logrotate |
| systemd 服务 | journald |
| 容器环境 | stdout + 外部采集 |
如果你是具体场景(比如 systemd / Docker / K8s / 多实例),我可以给你更精确的配置。