在 Debian 上把 Golang 应用的日志接入 ELK(Elasticsearch + Logstash + Kibana),常见、稳妥的做法有几种。下面按推荐程度给你一个完整方案。
Golang App
↓ (JSON 日志)
Filebeat(Debian 上)
↓
Logstash
↓
Elasticsearch
↓
Kibana
优点
不要打纯文本日志,否则 ELK 解析很痛苦。
示例(使用 logrus):
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.SetLevel(logrus.InfoLevel)
logrus.WithFields(logrus.Fields{
"service": "user-service",
"user_id": 123,
}).Info("user login success")
}
输出示例:
{
"level": "info",
"msg": "user login success",
"service": "user-service",
"user_id": 123,
"time": "2026-01-15T10:00:00Z"
}
sudo apt update
sudo apt install filebeat -y
启用并启动:
sudo systemctl enable filebeat
sudo systemctl start filebeat
编辑:
sudo vim /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/myapp/*.log
json.keys_under_root: true
json.add_error_key: true
output.logstash:
hosts: ["logstash:5044"]
如果是容器日志(docker),路径通常是:
/var/lib/docker/containers/*/*.log
input {
beats {
port => 5044
}
}
filter {
if [service] {
mutate {
add_field => { "index_prefix" => "%{service}" }
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "%{service}-logs-%{+YYYY.MM.dd}"
}
}
user-service-logs-*es := elasticsearch.NewClient(...)
es.Index("logs", json)
services:
app:
logging:
driver: json-file
Filebeat 读取 docker 日志即可。
mutate✅ Golang → JSON 日志
✅ Debian → Filebeat
✅ Logstash → ES → Kibana
如果你愿意,我可以:
直接说你的使用场景即可。