ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

90DaysOfDevOps 实战:用 Logspout 扩展将 Docker 容器日志零配置接入 Elastic Stack Logstash

90DaysOfDevOps 实战:用 Logspout 扩展将 Docker 容器日志零配置接入 Elastic Stack Logstash 文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载导读在 90DaysOfDevOps 课程的 Elastic StackELK监控实战中除了通过 Filebeat/Beats 主动采集日志还有一条更轻量的路径使用 Logspout 扩展让部署在 Docker 里的每个容器无需任何改造即可借助 Docker logs API 自动把 stdout/stderr 日志转发给 Logstash。本文以仓库中2022/ja/Days/Monitoring/Elastic Stack/extensions/logspout/目录下的扩展定义为核心讲解 Logspout 的工作原理、Compose 覆盖文件中的关键配置、Logstash 侧的 UDP 输入接入方式并结合 Dockerfile 与 Go 模块源码说明其底层实现帮助你快速把任意容器日志汇入 Elastic Stack。Logspout 扩展在 Elastic Stack 中的定位Elastic Stack 的 Docker 化编排见 docker-compose.yaml本身包含 elasticsearch、logstash、kibana、setup 四个核心服务。而extensions/目录专门用于存放第三方扩展用于打通更多外部集成extensions/README.md其中包括 filebeat、metricbeat、apm-server、curator、enterprise-search 以及本文的主角 logspout。Logspout 的定位与 Filebeat 不同它运行在 Docker 宿主机层面通过挂载/var/run/docker.sock调用 Docker logs API统一抓取宿主机上所有容器的日志再转发给 Logstash——容器侧完全不需要任何额外配置无需打日志、无需装 Agent、无需改 Dockerfile。这正是 logspout/README.md 开头所强调的Logspout collects all Docker logs using the Docker logs API, and forwards them to Logstash without any additional configuration。工作原理一条从 Docker Socket 到 Logstash 的日志管道Logspout 是 gliderlabs 出品的一款 Docker 日志路由工具其核心链路为Docker 容器 stdout/stderr │ ▼ Docker logs API通过挂载 /var/run/docker.sock 访问 │ ▼ Logspout 主进程gliderlabs/logspout │ logspout-logstash 适配器 ▼ UDP/TCP 发送到 logstash:5000 │ ▼ Logstashudp input json codec │ ▼ Elasticsearchlogstash_internal 用户写入其中关键的一环是适配器。Logspout 通过 Go 的匿名导入机制把 logstash-logstash 适配器编译进镜像见 modules.gopackage main // installs the Logstash adapter for Logspout, and required dependencies import ( _ github.com/gliderlabs/logspout/healthcheck _ github.com/gliderlabs/logspout/transports/tcp _ github.com/gliderlabs/logspout/transports/udp _ github.com/looplab/logspout-logstash )从源码结构可以推断logspout-logstash适配器负责将 Logspout 采集到的日志事件序列化成 Logstash 可识别的 JSON 并送出同时显式导入了udp、tcp两个 transport为后续路由ROUTE_URIS提供可用的发送通道healthcheck则为容器提供健康检查能力。对应的 Dockerfile 采用 Logspout 官方文档推荐的 custom 构建方式FROM gliderlabs/logspout:master ENV SYSLOG_FORMAT rfc3164基础镜像gliderlabs/logspout:master带有 ONBUILD 指令会自动把构建上下文中的modules.go编译进 Logspout 主程序因此镜像内才内置了 Logstash 适配器SYSLOG_FORMAT则指定了 syslog 格式相关的环境默认值。启用扩展Compose 覆盖文件逐项拆解启用方式无需改动任何现有编排文件只需要在启动时追加一个 Compose 覆盖文件原文档给出的命令docker-compose -f docker-compose.yml -f extensions/logspout/logspout-compose.yml up注意原文档写的是docker-compose.yml而当前仓库中基础编排文件的实际文件名是docker-compose.yaml位于 Elastic Stack 目录二者等价按你本地实际文件名选择即可。Docker Compose 会按顺序合并两个文件最终把logspout服务加入elk网络。覆盖文件的核心内容位于 logspout-compose.yml逐项解读如下version: 3.7 services: logspout: build: context: extensions/logspout # 使用上面的 Dockerfile modules.go 构建自定义镜像 volumes: - type: bind source: /var/run/docker.sock # 挂载 Docker 守护进程 socket target: /var/run/docker.sock read_only: true # 只读挂载降低权限风险 environment: ROUTE_URIS: logstash://logstash:5000 # 路由目标Logstash 的 5000 端口 LOGSTASH_TAGS: docker-elk # 为事件附加的标签便于在 Elasticsearch 中区分来源 networks: - elk depends_on: - logstash restart: on-failure配置要点与对应影响/var/run/docker.sock只读挂载这是 Logspout 读取 Docker logs API 的通道。read_only: true表示 Logspout 只能读 Docker 事件与日志不能对 Docker 进行写操作是安全实践。ROUTE_URIS: logstash://logstash:5000这是 Logspout 的路由声明语法为adapter://host:port。logstash://会触发前面编译进去的logspout-logstash适配器把日志发送到elk网络内 Logstash 服务名logstash的 5000 端口。LOGSTASH_TAGS: docker-elk适配器会给每个日志事件打上该标签Kibana 中可用tags: docker-elk过滤出这批 Docker 容器日志。networks: - elk必须与 Logstash 处于同一 Docker 网络才能通过服务名解析到logstash。depends_on: logstash保证 Logstash 先启动避免 Logspout 启动时路由目标不可达。restart: on-failureLogspout 异常退出时自动重启提升日志采集的可用性。Logstash 侧接入启用 udp input 并设置 json codecLogspout 通过 UDP 把日志送到 Logstash 的 5000 端口因此 Logstash 的管道配置必须增加udp输入且codec必须是json因为 logspout-logstash 适配器发送的是 JSON 格式事件。原文档给出的配置片段input { udp { port 5000 codec json } }对照仓库中现有的 logstash.conf可以看到当前管道已包含beats5044与tcp5000两个输入但尚未包含 udp 输入input { beats { port 5044 } tcp { port 5000 } }也就是说接入 Logspout 时你需要在管道中新增上述udp输入块保留原有 beats/tcp 输入即可完成后的输入段大致为input { beats { port 5044 } tcp { port 5000 } udp { port 5000 codec json } }这得益于基础编排文件 docker-compose.yaml 中 Logstash 服务的端口映射已经同时暴露了 TCP 与 UDP 两种协议5000:5000/tcp与5000:5000/udp因此 UDP 流量可以直接进入容器。事件进入管道后会按现有 output 配置写入 Elasticsearchoutput { elasticsearch { hosts elasticsearch:9200 user logstash_internal password ${LOGSTASH_INTERNAL_PASSWORD} } }其中logstash_internal用户及密码由 setup 服务 在栈初始化时通过.env中的LOGSTASH_INTERNAL_PASSWORD创建。验证接入是否生效启动后可以按以下步骤验证整条链路确认服务状态docker-compose ps应能看到logspout与logstash均为运行状态。查看 Logspout 日志docker-compose logs logspout正常时应显示路由建立成功例如出现指向logstash:5000的路由日志。制造一条日志任意在宿主机上运行或已在运行的容器只要输出到 stdout/stderrLogspout 都会自动抓取无需该容器做任何配置。在 Kibana 验证进入 Kibana默认 5601 端口在 Discover 中按tags: docker-elk过滤即可看到来自各个 Docker 容器的日志事件已进入 Elasticsearch。使用边界与注意事项面向宿主机所有容器Logspout 抓取的是整个 Docker 守护进程可见的日志适合全量采集、统一收口的场景如果你只想采集特定容器的日志更合适的选择是仓库中同样位于 extensions 下的 filebeat 扩展。依赖 Docker socketLogspout 必须能访问/var/run/docker.sock在 Docker Desktop、远程 Docker 主机或受限的容器运行环境中需确保该路径可用。单宿主机语义每个 Docker 主机需要一个 Logspout 实例多主机集群场景需要按主机分别部署或改用其他集中式采集方案。日志格式Logspout 默认采集容器 stdout/stderr 原始内容结构化日志JSON需要容器自身输出 JSONLogstash 侧才可能做字段解析非 JSON 日志也可保留为 message 字段全文检索。小结在 90DaysOfDevOps 的 Elastic Stack 实战中Logspout 扩展提供了一条零侵入、零配置的 Docker 日志接入路径通过只读挂载 Docker socket 调用 logs API配合 Go 模块编译进镜像的 logspout-logstash 适配器把全量容器日志经 UDP 5000 送入 Logstash最终落地 Elasticsearch 供 Kibana 检索分析。本文对应的全部编排与源码文件均可在仓库2022/ja/Days/Monitoring/Elastic Stack/extensions/logspout/下直接查看英文原版对照位于 2022/Days/Monitoring/Elastic Stack配合课程正文 day80.md 可形成完整的 Elastic Stack 学习闭环。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 实战使用 Logspout 扩展将 Docker 容器日志零配置接入 ELK 的 Logstash90DaysOfDevOps 实战使用 Logspout 扩展将 Docker 容器日志零配置接入 ELK 的 Logstash 在 ELKElastics文档/教程90DaysOfDevOps 的 ELK 日志栈扩展用 Logspout 将 Docker 容器日志零配置转发至 Logstash90DaysOfDevOps 的 ELK 日志栈扩展用 Logspout 将 Docker 容器日志零配置转发至 Logstash 在 90DaysOfDev文档/教程90DaysOfDevOps 实战为 Elastic Stack 启用 APM Server 扩展并接入 Agent90DaysOfDevOps 实战为 Elastic Stack 启用 APM Server 扩展并接入 Agent 导读 本篇文章围绕 90DaysOfDe文档/教程上一篇CANN hixl 头文件与库文件全解析接口布局、对应关系与编译链接指南下一篇终极指南如何轻松修改Vane AI问答引擎的默认端口3000创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表