在 Debian 系统上抓取 Golang 程序日志,通常有几种常见方式,取决于你的 Golang 程序是如何运行的(系统服务 / 容器 / 直接运行)以及 日志输出到哪里(stdout、文件、syslog)。
下面按常见场景说明。
Golang 程序通常输出到 stdout / stderr:
log.Println("server started")
/etc/systemd/system/myapp.service
[Unit]
Description=Golang App
After=network.target
[Service]
ExecStart=/opt/myapp/myapp
WorkingDirectory=/opt/myapp
User=appuser
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
journalctl -u myapp.service
实时查看:
journalctl -u myapp.service -f
按时间:
journalctl -u myapp.service --since "2026-01-15 10:00"
f, _ := os.OpenFile("/var/log/myapp.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
log.SetOutput(f)
/etc/logrotate.d/myapp
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
tail -f /var/log/myapp.log
import "log/syslog"
syslog.New(syslog.LOG_INFO, "myapp")
log.Println("hello syslog")
journalctl -t myapp
或旧系统:
tail -f /var/log/syslog
log.Println("hello docker")
docker logs -f myapp
使用 zap 或 logrus:
logger, _ := zap.NewProduction()
logger.Info("user login", zap.String("user", "tom"))
日志可输出到:
| 场景 | 推荐方式 |
|---|---|
| Debian 服务 | systemd + journalctl |
| 传统部署 | 文件 + logrotate |
| 容器 | stdout + docker logs |
| 生产环境 | 结构化日志 + 集中收集 |
如果你愿意,可以告诉我:
我可以给你更精确的抓取方案。