在 Debian 系统上采集 Golang 应用的日志,常见做法分为 应用内日志输出方式、系统级采集方式 以及 集中式日志方案。下面按实用场景逐步说明。
无论用什么方式采集,第一步是让日志可被系统捕获。
log.Println("hello")
fmt.Println("info")
systemd / docker 都能直接采集。
log.SetOutput(os.OpenFile("/var/log/myapp/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644))
Debian 通常使用 systemd。
# /etc/systemd/system/myapp.service
[Unit]
Description=My Golang App
[Service]
ExecStart=/opt/myapp/myapp
WorkingDirectory=/opt/myapp
User=appuser
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
journalctl -u myapp -f
journalctl -u myapp --since "2024-01-01" > myapp.log
如果你把日志写到文件:
/var/log/myapp/app.log
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
filebeat.inputs:
- type: log
paths:
- /var/log/myapp/*.log
output.elasticsearch:
hosts: ["http://localhost:9200"]
安装:
sudo apt install filebeat
docker logs -f myapp
docker run --log-driver=journald myapp
使用 zerolog / zap:
logger := zerolog.New(os.Stdout).With().Timestamp().Logger()
logger.Info().Str("module", "http").Msg("request received")
便于 ELK / Loki 解析。
| 场景 | 推荐方式 |
|---|---|
| 简单服务 | systemd + journalctl |
| 文件日志 | logrotate + Filebeat |
| 容器 | stdout + docker logs |
| 生产环境 | 结构化日志 + 集中采集 |
如果你愿意,可以告诉我:
我可以直接给你一套完整配置。