外部日志聚合
多容器环境需要集中管理日志,下面介绍集成外部日志系统方法。
Fluentd + ELK
架构
YAML
容器 → Fluentd → Elasticsearch → Kibana (可视化)
配置 Fluentd
Bash
# docker-compose.yml
services:
fluentd:
image: fluent/fluentd:v1.16
ports:
- "24224:24224"
volumes:
- ./fluent.conf:/fluentd/etc/fluent.conf
elasticsearch:
image: elasticsearch:8.11
environment:
- discovery.type=single-node
kibana:
image: kibana:8.11
ports:
- "5601:5601"
depends_on:
- elasticsearch
fluent.conf:
YAML
<source>
@type forward
port 24224
</source>
<match docker.**>
@type elasticsearch
host elasticsearch
port 9200
logstash_format true
logstash_prefix docker
</match>
容器发送日志
Bash
# 使用 fluentd 驱动
docker run -d \
--name my-app \
--log-driver fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="docker.my-app" \
my-app
Loki + Grafana
架构
Bash
容器 → Promtail → Loki → Grafana (可视化)
配置 Promtail
text
services:
loki:
image: grafana/loki:2.9
ports:
- "3100:3100"
promtail:
image: grafana/promtail:2.9
volumes:
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:10.2
ports:
- "3000:3000"
Logstash 集成
text
# 使用 Logstash 驱动
docker run -d \
--name my-app \
--log-driver gelf \
--log-opt gelf-address=udp://localhost:12201 \
--log-opt tag="my-app" \
my-app
logstash.conf:
text
input {
gelf {
port => 12201
type => "docker"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-%{+YYYY.MM.dd}"
}
}
日志标签与过滤
text
# 添加标签
docker run -d \
--name my-app \
--log-driver fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="docker.{{.Name}}" \
--log-opt labels=production_status,service_name \
--log-opt env=NODE_ENV,VERSION \
my-app
优势
- 集中管理:所有容器日志统一存储
- 全文搜索:ELK 支持全文检索
- 可视化:Grafana/Kibana 图表展示
- 告警:配置日志阈值告警
- 保留策略:按时间自动清理旧日志
要点总结
- Fluentd + ELK 实现容器日志集中存储和检索
- Loki + Grafana 轻量级替代,适合 Kubernetes 环境
- Gelf/Logstash 驱动发送日志到外部系统
- 日志标签(tag、labels、env)便于分类和过滤
- 外部日志系统支持全文搜索、可视化和告警
📝 发现内容有误?点击此处直接编辑