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),仅供参考

相关新闻

PPC 竞价策略师:用 agency-agents-zh 智能体驾驭从 1 万到 1000 万月预算的搜索竞价账户

PPC 竞价策略师:用 agency-agents-zh 智能体驾驭从 1 万到 1000 万月预算的搜索竞价账户

人工智能AI 技能提示工程 【免费下载链接】agency-agents-zh 🎭 277 个即插即用的 AI 专家角色 — 支持 Claude Code/Cursor/Copilot 等 20 种工具,覆盖工程/设计/营销/金融等 20 个部门。含 64 个中国市场原创智能体(小红书/抖音/微信/飞书/…

2026/10/4 1:46:32 阅读更多 →
Warp 会话恢复增强:代码编辑器面板与 Markdown 编辑器的跨重启还原实现

Warp 会话恢复增强:代码编辑器面板与 Markdown 编辑器的跨重启还原实现

桌面应用开发者工具人工智能AI 应用AI Agent代码智能体 【免费下载链接】warp Warp is an agentic development environment, born out of the terminal. 项目地址: https://gitcode.com/GitHub_Trending/wa/warp 点击查看 免费下载 在 Warp 中,终端标签…

2026/10/4 1:46:32 阅读更多 →
MyBatis 分离查询优化策略

MyBatis 分离查询优化策略

传统的JOIN查询容易导致致的数据膨胀和分页问题,对于该问题的解决方案就是:将主表查询与关联表查询分离,通过 Stream API 高效组装数据。方案对比方案 A:传统 JOIN 查询┌───────────────────────────…

2026/10/4 1:45:31 阅读更多 →

最新新闻

长沙曾食坊小吃培训的增香与去腥:调味思路怎么学

长沙曾食坊小吃培训的增香与去腥:调味思路怎么学

本篇要点:动物原料预处理路径;香料下锅顺序与出香温度;复合调味层次。去腥不是多放料酒就行,增香也不是堆香料。本文补增香去腥的调味思路:动物性原料怎么预处理、香料什么温度下锅才出香、增香靠油脂还是发酵、复合味…

2026/10/4 4:35:21 阅读更多 →
UE5地编审美提升:构图色彩光影密度四维实战指南

UE5地编审美提升:构图色彩光影密度四维实战指南

1. 为什么地编越做越丑?审美比工具更重要做 UE5 地编的同学应该都有过这样的经历:软件操作已经很熟了,刷地形、铺植被、拖资产、拉灯光,流程跑得飞快,但做完一渲染,画面总是不对劲——要么灰蒙蒙像没做完&a…

2026/10/4 4:35:21 阅读更多 →
ATAC-seq数据分析全流程:从FASTQ到差异peak与motif实战指南

ATAC-seq数据分析全流程:从FASTQ到差异peak与motif实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 4:35:21 阅读更多 →
Go分布式资产管理系统:强一致调拨与百万级台账实战

Go分布式资产管理系统:强一致调拨与百万级台账实战

简介:这是一套面向计算机专业本科生与网络安全从业者的毕业设计级分布式资产管理系统,专为红队渗透、SRC应急响应及企业安全审计场景打造,解决资产发现、漏洞扫描、统一管理与自动化报告生成等核心问题。资源包共403个文件,含159个…

2026/10/4 4:35:21 阅读更多 →
Java Swing+MySQL学生选课系统课程设计实战

Java Swing+MySQL学生选课系统课程设计实战

简介:这是一套完整的Java课程设计级学生选课与成绩管理系统,面向Java初学者及课程设计实践者,聚焦Swing桌面应用开发与MySQL数据库交互能力训练。系统涵盖管理员、教师、学生三类角色,支持课程管理、选课操作、成绩录入与查询等核…

2026/10/4 4:35:21 阅读更多 →
前端开发中 class 没死:从原型链到组合式函数的演进与选型

前端开发中 class 没死:从原型链到组合式函数的演进与选型

不用纠结那个标题,我先直接说结论:class 没有死,也没有被“主流抛弃”,它只是从“默认选项”变成了“可选项”。现在打开 GitHub 上那些新起的 TypeScript 项目,函数式写法、组合式函数几乎是默认风格,clas…

2026/10/4 4:34:20 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →