在 Debian 系统上配置 Go(Golang)日志,通常分为应用内日志配置和**系统级日志管理(journald / rsyslog / logrotate)**两部分。下面按常见场景说明。
logpackage main
import (
"log"
"os"
)
func main() {
file, err := os.OpenFile("/var/log/myapp/app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("server started")
}
⚠️ 注意:
/var/log/myapp 需要存在且应用有写权限www-data 或专用用户log/slog(Go 1.21+ 推荐)package main
import (
"log/slog"
"os"
)
func main() {
logger := slog.New(slog.NewTextHandler(os.Stdout, nil))
slog.SetDefault(logger)
logger.Info("starting service", "port", 8080)
}
生产建议输出到 stdout(由 systemd 接管):
slog.New(slog.NewJSONHandler(os.Stdout, nil))
zap(Uber)logruszerolog示例(zap):
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("hello")
/etc/systemd/system/myapp.service
[Unit]
Description=My Go App
After=network.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp
journalctl -u myapp -f
✅ 优点:
/var/log/myapp/app.log
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
⚠️ copytruncate 对 Go 程序较安全
适合需要统一收集日志的场景,一般不推荐新项目使用。
sudo mkdir -p /var/log/myapp
sudo chown myapp:myapp /var/log/myapp
✔ 使用 systemd + stdout + JSON 日志
✔ 不要在代码里手写日志轮转
✔ 日志级别可控(debug / info / warn / error)
✔ 敏感信息不要进日志
如果你愿意,我可以:
你现在是 裸机 Debian 还是 容器环境?