要将 docker 容器日志集成到 elk stack,需配置日志驱动、logstash 管道、elasticsearch 和 kibana;1. 选择合适的日志驱动,如 gelf 或 fluentd,以便结构化发送日志至 logstash;2. 配置 logstash 使用 gelf 输入插件监听端口,并通过 json 或 grok 过滤器解析日志内容;3. 设置 mutate 插件重命名字段,并通过 elasticsearch 输出插件按日期索引存储日志;4. 在 kibana 创建索引模式 docker-* 并构建可视化面板,如柱状图展示服务日志数量;5. 对多行日志使用 multiline 过滤器合并异常堆栈信息;6. 使用 cadvisor 和 metricbeat 收集容器资源指标并发送至 elasticsearch,便于在 kibana 中监控性能。
Docker 容器日志收集并用 ELK Stack (Elasticsearch, Logstash, Kibana) 进行分析,核心在于将容器的 stdout/stderr 重定向,并用 Logstash 统一收集处理,最终通过 Kibana 可视化。
将 Docker 容器的日志集成到 ELK Stack 中,需要配置 Docker 日志驱动、Logstash 管道,以及 Elasticsearch 索引和 Kibana 面板。
如何选择 Docker 日志驱动?
Docker 提供了多种日志驱动,比如 json-file、syslog、gelf、fluentd 等。选择哪个驱动取决于你的具体需求。json-file 是默认驱动,简单易用,但不利于大规模日志收集。syslog 适合与传统的 syslog 服务器集成。gelf 适用于 graylog。而 fluentd 则适合与 Fluentd 集成。
如果目标是 ELK Stack,推荐 gelf 或 fluentd,因为它们可以直接将日志以结构化数据发送到 Logstash。使用 json-file 也行,但需要在 Logstash 中进行更多的解析工作。
例如,使用 gelf 驱动,你需要在 docker-compose.yml 文件中配置:
version: "3.8" services: web: image: nginx:latest logging: driver: "gelf" options: gelf-address: "udp://localhost:12201" tag: "nginx"
这里,gelf-address 指定了 Logstash 监听的地址,tag 用于标识日志来源。
Logstash 如何配置才能正确解析 Docker 日志?
Logstash 的配置是关键。你需要创建一个 Logstash 管道,用于接收 Docker 发送的日志,并进行解析和过滤。
一个简单的 Logstash 配置文件可能如下所示:
input { gelf { port => 12201 } } filter { json { source => "message" remove_field => "message" } mutate { rename => { "container_name" => "service_name" } } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "docker-%{+yyYY.MM.dd}" } stdout { codec => rubydebug } }
这个配置做了几件事:
- 使用 gelf 输入插件,监听 12201 端口。
- 使用 json 过滤器,解析 message 字段中的 JSON 数据。如果你的 Docker 日志已经是 JSON 格式,这一步很重要。
- 使用 mutate 过滤器,重命名 container_name 字段为 service_name。这可以让你更好地组织日志。
- 使用 elasticsearch 输出插件,将日志发送到 Elasticsearch。index 指定了索引的名称,这里使用了日期格式,每天创建一个新的索引。
- 使用 stdout 输出插件,将日志打印到控制台,方便调试。
注意,这个配置只是一个示例。你需要根据你的实际情况进行调整。比如,如果你的 Docker 日志不是 JSON 格式,你需要使用 grok 过滤器进行解析。
如何在 Kibana 中创建 Docker 日志的可视化面板?
一旦你的 Docker 日志被成功地索引到 Elasticsearch 中,你就可以在 Kibana 中创建可视化面板了。
首先,你需要创建一个索引模式,告诉 Kibana 如何访问你的 Elasticsearch 索引。在 Kibana 的 “Management” -> “Stack Management” -> “Index Patterns” 中,创建一个新的索引模式,指定索引名称为 docker-*。
然后,你就可以创建各种可视化面板了。比如,你可以创建一个柱状图,显示每个服务的日志数量:
- 在 Kibana 的 “Analytics” -> “Dashboard” 中,创建一个新的 Dashboard。
- 点击 “Create new”,选择 “Visualization”。
- 选择 “Vertical bar”。
- 选择你的 docker-* 索引模式。
- 在 “Buckets” 中,选择 “X-axis”,然后选择 “Terms”,选择 service_name 字段。
- 点击 “Update”。
你还可以创建其他的可视化面板,比如折线图、饼图、地图等,来分析你的 Docker 日志。
如何处理多行 Docker 日志?
Docker 容器的日志经常包含多行文本,例如 Java 程序的异常堆栈。默认情况下,Logstash 会将每一行文本作为一个独立的日志事件处理,导致堆栈信息被分割。
要解决这个问题,可以使用 Logstash 的 multiline 过滤器。这个过滤器可以将多行文本合并成一个日志事件。
例如,假设你的 Java 程序的异常堆栈以 “Exception:” 开头,你可以使用如下配置:
filter { multiline { pattern => "^Exception:" negate => true what => "previous" } }
这个配置的意思是:如果一行文本不以 “Exception:” 开头,就将它合并到前一个日志事件中。
注意,multiline 过滤器可能会影响 Logstash 的性能。如果你的日志量很大,可以考虑使用其他的解决方案,比如在应用程序中将异常堆栈格式化成单行 JSON 数据。
如何监控 Docker 容器的资源使用情况?
除了日志,监控 Docker 容器的资源使用情况也很重要。你可以使用 cadvisor 来收集 Docker 容器的 CPU、内存、网络等指标,并将这些指标发送到 Elasticsearch 中。
cAdvisor 是一个开源的容器资源监控工具,由 Google 开发。它可以自动发现 Docker 容器,并收集它们的资源使用情况。
要使用 cAdvisor,你需要运行一个 cAdvisor 容器:
docker run --volume=/var/run/docker.sock:/var/run/docker.sock:ro --volume=/:/rootfs:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --name=cadvisor gcr.io/cadvisor/cadvisor:latest
然后,你可以通过访问 http://localhost:8080 来查看 cAdvisor 的 Web 界面。
要将 cAdvisor 的指标发送到 Elasticsearch 中,你需要配置一个 Metricbeat 模块。Metricbeat 是一个轻量级的指标收集器,由 Elastic 开发。它可以从各种来源收集指标,并将这些指标发送到 Elasticsearch 中。
要配置 Metricbeat,你需要创建一个配置文件 metricbeat.yml:
metricbeat.modules: - module: docker metricsets: ["container", "cpu", "diskio", "memory", "network"] hosts: ["unix:///var/run/docker.sock"] period: 10s output.elasticsearch: hosts: ["http://localhost:9200"]
这个配置的意思是:
- 启用 docker 模块,收集容器、CPU、磁盘 IO、内存、网络等指标。
- 指定 Docker 的 API 地址为 unix:///var/run/docker.sock。
- 指定收集周期为 10 秒。
- 将指标发送到 Elasticsearch。
然后,你可以运行 Metricbeat:
./metricbeat -e -c metricbeat.yml
一旦 Metricbeat 开始运行,你就可以在 Kibana 中创建可视化面板,来监控 Docker 容器的资源使用情况了。