在 Debian 上收集 Golang 应用日志,通常可以从应用自身日志输出方式、系统/服务管理方式以及集中化收集方案三个层面来做。下面按常见场景说明。
大多数 Golang 程序(尤其是用 log、log/slog、zap 等)默认输出到标准输出:
log.Println("hello")
在 Debian 上,如果通过 systemd 管理,这些日志会被 journald 收集。
查看日志:
journalctl -u your-service.service -f
例如:
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
日志文件建议放在:
/var/log/myapp/查看:
tail -f /var/log/myapp/app.log
/etc/systemd/system/myapp.service
[Unit]
Description=My Golang App
After=network.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/myapp
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
# 启动
systemctl start myapp
# 查看日志
journalctl -u myapp
# 实时日志
journalctl -u myapp -f
# 最近 100 行
journalctl -u myapp -n 100
如果写文件日志,建议配置 logrotate:
/etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
copytruncate对不支持信号重开的 Golang 程序很重要。
把 Golang 日志写入文件,由 rsyslog 转发。
示例(Filebeat):
filebeat.inputs:
- type: journald
units: ["myapp.service"]
log(简单)log/slog(Go 1.21+)zap、zerolog示例(slog + systemd):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("start", "port", 8080)
systemctl status myapp/var/log/myapp 归属运行用户如果你愿意,可以告诉我:
我可以给你更具体的配置示例。