在 Linux 下采集 Golang 程序日志,常见做法可分为 日志产生方式 和 日志采集方式 两部分。下面从实际工程角度给你一个系统性说明。
import "log"
log.Println("this is a log")
缺点:功能弱,不适合生产环境。
import "github.com/sirupsen/logrus"
log := logrus.New()
log.SetFormatter(&logrus.JSONFormatter{})
log.Info("service started")
import "go.uber.org/zap"
logger, _ := zap.NewProduction()
logger.Info("hello zap")
✅ 生产建议:
Golang 程序只打印日志,不管理文件
logger.Info("user login")
由 Linux 环境采集:
[Unit]
Description=go-service
[Service]
ExecStart=/opt/app/server
Restart=always
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
journalctl -u go-service -f
✅ 优点:
docker run \
--log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
my-go-app
查看:
docker logs -f container_id
Docker 默认会采集 stdout。
如果 Golang 写文件:
log.SetOutput(os.OpenFile("/var/log/app.log", ...))
filebeat.inputs:
- type: log
paths:
- /var/log/app.log
output.elasticsearch:
hosts: ["localhost:9200"]
⚠️ 不推荐新项目使用(复杂、易丢日志)
Go 程序:
K8s:
kubectl logs pod-name -f
✅ 日志内容建议:
{
"time": "2026-01-15T10:00:00Z",
"level": "info",
"service": "user-service",
"msg": "user login",
"trace_id": "abc123"
}
✅ 不推荐:
| 场景 | 推荐方案 |
|---|---|
| 物理机 | systemd + journald |
| Docker | stdout + docker log |
| K8s | stdout + Loki |
| 老系统 | Filebeat + 文件 |
如果你愿意,可以告诉我:
我可以直接给你一套 可复制的配置。