在 Debian 上管理 Golang 日志的实用方案
一 方案总览
二 快速上手 输出到文件并轮转
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
writer := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp.log", // 日志路径(确保目录可写,建议以服务用户运行)
MaxSize: 100, // 单文件上限,单位 MB
MaxBackups: 7, // 保留旧文件个数
MaxAge: 28, // 保留天数
Compress: true, // 是否压缩归档
})
cfg := zap.NewProductionEncoderConfig()
core := zapcore.NewCore(
zapcore.NewJSONEncoder(cfg), // 生产环境建议 JSON
writer,
zap.InfoLevel,
)
logger := zap.New(core)
defer logger.Sync()
logger.Info("hello, golang log on debian")
}
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 myapp myapp # 建议与运行服务的用户/组一致
copytruncate # 适用于持续写入的文件句柄场景
}
说明:
三 使用 systemd 与 journald 集中管理
# /etc/systemd/system/myapp.service
[Unit]
Description=My Golang Application
After=network.target
[Service]
ExecStart=/usr/local/bin/myapp
Restart=always
User=myapp
Group=myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
四 集中式日志与监控
五 实践建议