在 Debian 下抓取(收集、查看、导出)Golang 程序日志,通常分为查看日志、实时抓取日志、系统级收集日志几种方式。下面按常见场景说明。
Golang 本身不强制日志位置,常见情况:
log.Println("hello")
log.SetOutput(os.OpenFile("/var/log/app.log", ...))
logruszapslog(Go 1.21+)./yourapp
nohup ./yourapp > /var/log/app.log 2>&1 &
查看:
tail -f /var/log/app.log
如果你用 systemd 管理 Golang 服务:
[Unit]
Description=Go App
[Service]
ExecStart=/opt/app/yourapp
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
journalctl -u yourapp.service
实时查看:
journalctl -u yourapp.service -f
按时间:
journalctl -u yourapp --since "2024-01-01 00:00"
导出日志:
journalctl -u yourapp > app.log
tail -f /var/log/app.log
过滤 ERROR:
tail -f /var/log/app.log | grep ERROR
/etc/logrotate.d/goapp
/var/log/app.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
Golang 输出到 local0:
log.SetOutput(os.Stdout)
rsyslog 配置:
if ($programname == "yourapp") then {
action(type="omfile" file="/var/log/yourapp.log")
}
适合 ELK / Loki:
dmesg | grep yourapp
journalctl -xe
defer func() {
if r := recover(); r != nil {
log.Println("panic:", r)
}
}()
| 场景 | 方法 |
|---|---|
| 简单查看 | tail -f |
| 服务化 | systemd + journalctl |
| 生产环境 | logrotate + filebeat |
| 调试 | journalctl -u |
如果你能告诉我:
我可以给你更精确的命令。