Laradock 中的 Logstash:搭建 ELK 日志管道的完整实战指南
【免费下载链接】laradockFull PHP development environment for Docker. Run Laravel, Symfony, CodeIgniter, Phalcon, WordPress, Drupal, Magento, Moodle, or any PHP project with 70+ pre-configured services: Nginx, Apache, PHP-FPM, MySQL, PostgreSQL, MongoDB, Redis, Elasticsearch & more.项目地址: https://gitcode.com/gh_mirrors/la/laradock
导读:本文讲解如何在 Laradock 中运行 Logstash——ELK 技术栈中的 "L",即负责从多源采集日志/事件、经过转换后写入 Elasticsearch 的服务端数据处理管道。你将掌握 Logstash 容器的启动/停止/移除、与 Elasticsearch/Kibana 的版本匹配机制、管道配置文件的编写与热重载,以及用命令行做配置校验和插件检查的完整实战方法。
Logstash 在 Laradock 中的角色
Logstash** 和Kibana构成一套开箱即用的本地日志分析环境。
Laradock 将 Logstash 构建为独立的容器,镜像版本由根目录.env中的共享变量ELK_VERSION统一控制,从而保证 Logstash、Elasticsearch、Kibana 三者版本对齐。在.env.example中,该变量的默认值为ELK_VERSION=8.19.13(见 .env.example),Elastic 官方要求栈内各组件的 major/minor 版本必须匹配,这也是 Laradock 使用单一变量驱动三个镜像的原因。
启动 Logstash
方式一:Laradock CLI
./laradock start logstash方式二:Docker Compose
docker compose up -d logstash在 logstash/compose.yml 中,logstash服务通过depends_on声明了elasticsearch依赖,因此启动 Logstash 时 Elasticsearch 会自动一并拉起——正如文档所述:没有 Elasticsearch,Logstash 的日志数据无处可送。
停止与移除 Logstash
暂停容器(数据安全,之后可再次启动):
# Laradock CLI ./laradock stop logstash # Docker Compose docker compose stop logstash彻底删除容器:
# Laradock CLI ./laradock remove logstash # Docker Compose docker compose rm -sf logstash配置总览:版本、端口与 JVM 堆内存
与许多 Laradock 服务不同,Logstash没有logstash/defaults.env文件。它的镜像构建依赖根.env的ELK_VERSION变量,而端口与 JVM 堆内存则直接固化在 logstash/compose.yml 中,未暴露为.env变量:
| 配置项 | 值 | 设置位置 |
|---|---|---|
| 端口映射 | 5001:5001 | logstash/compose.yml |
LS_JAVA_OPTS | -Xmx1g -Xms1g | logstash/compose.yml |
从源码看,logstash/compose.yml 将ELK_VERSION通过build.args传给镜像构建:
build: context: ./logstash args: - ELK_VERSION=${ELK_VERSION}而 logstash/Dockerfile 的第一行即使用该 ARG 指定基础镜像:
ARG ELK_VERSION FROM logstash:${ELK_VERSION}这意味着:只要修改根.env中的ELK_VERSION,重新构建 Logstash 镜像即可切换版本,且天然与 Elasticsearch/Kibana 保持一致。
同时,容器通过networks挂接在frontend与backend两个 Laradock 自定义网络上(这两个网络定义在根 docker-compose.yml 中)。这也是 Logstash 与其他容器通信的基础:在管道配置中访问 Elasticsearch 必须使用容器名elasticsearch,而不是localhost。
配置 Logstash 管道
Logstash 的运行由两个挂载进容器的部分驱动:
- 服务器配置
logstash/config/logstash.yml,挂载到容器内/usr/share/logstash/config/logstash.yml; - 管道目录
logstash/pipeline/,挂载到容器内/usr/share/logstash/pipeline,用于存放你的.conf管道文件。
两个挂载均在 logstash/compose.yml 的volumes中声明。
服务器配置解读
logstash/config/logstash.yml 的内容非常精简,共四行关键配置:
http.host: "0.0.0.0" xpack.monitoring.enabled: false config.reload.automatic: true path.config: "/usr/share/logstash/pipeline"http.host: "0.0.0.0":Logstash 的 HTTP 接口绑定所有网络接口,保证容器外部可访问;xpack.monitoring.enabled: false:关闭 X-Pack 监控(本地开发场景下避免不必要的资源开销与 license 限制);config.reload.automatic: true:开启配置自动重载,管道文件变更后无需重启容器即生效;path.config: "/usr/share/logstash/pipeline":指定管道配置目录,与挂载点一致,也是--config.test_and_exit校验时扫描的路径。
镜像预置的插件与驱动
logstash/Dockerfile 在官方镜像之上做了三处定制,值得留意:
USER root RUN rm -f /usr/share/logstash/pipeline/logstash.conf RUN curl -L -o /usr/share/logstash/lib/mysql-connector-java-5.1.47.jar https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar COPY ./pipeline/ /usr/share/logstash/pipeline/ COPY ./config/ /usr/share/logstash/config/ RUN logstash-plugin install logstash-input-beats- 删除官方镜像自带的示例
logstash.conf,避免污染你的管道目录; - 通过 curl 下载并内置 MySQL JDBC 驱动
mysql-connector-java-5.1.47.jar,方便在管道中直接使用jdbcinput 插件查询 MySQL; - 预装
logstash-input-beats插件,可直接接收 Filebeat/Metricbeat 等 Beats 系列采集器发送的数据。
也就是说,从 Filebeat 采集服务器日志、用 MySQL JDBC 驱动读取业务数据,这两条最常见的管道入口都已开箱即用。
最小可用管道示例
logstash/pipeline/目录初始是空的(仅含一个.gitkeep),在放入.conf文件之前 Logstash 不会处理任何数据。一个最小管道——接收 Beats 输入并直接写入 Elasticsearch:
input { beats { port => 5044 } } output { elasticsearch { hosts => ["elasticsearch:9200"] index => "logs-%{+YYYY.MM.dd}" } }将其保存为logstash/pipeline/logstash.conf,Logstash 会因config.reload.automatic: true自动加载,无需重启。两个注意点:
- output 的 host 必须写容器名
elasticsearch(端口9200对应容器内 Elasticsearch 的 REST 接口),不要写localhost,因为 Logstash 与 Elasticsearch 各自运行在独立容器中,通过frontend/backend网络互联; index使用日期通配符%{+YYYY.MM.dd}生成按天滚动的索引,这是日志场景的常见约定。
管道上线前先做语法校验
自动重载虽方便,但生产管道文件若存在语法错误,Logstash 会静默地加载失败。因此改动管道后,务必先用测试模式校验:
# Laradock CLI ./laradock exec -T logstash bin/logstash --config.test_and_exit # Docker Compose docker compose exec -T logstash bin/logstash --config.test_and_exit该命令会校验path.config(即/usr/share/logstash/pipeline)下的所有管道文件,校验通过后直接退出、不会启动管道,因此即使容器当前正在处理数据,也可以安全地对它执行。-T表示不分配伪终端,适合在脚本/CI 中调用。
检查已安装插件
确认预装的logstash-input-beats(或你后来手动安装的插件)是否就位:
# Laradock CLI ./laradock exec -T logstash bin/logstash-plugin list # Docker Compose docker compose exec -T logstash bin/logstash-plugin list输出列表中应能看到logstash-input-beats;若你通过管道使用了 MySQLjdbc输入,还需要在输出中确认logstash-input-jdbc插件同样存在。
常见问题排查
No pipeline is running(没有管道在运行):
logstash/pipeline/目录初始为空(仅.gitkeep),Logstash 必须至少有一个包含input/output块的.conf文件才会开始处理,参考上文最小可用管道示例。Can't reach Elasticsearch(无法连接 Elasticsearch):管道 output 的 host 必须使用容器名
elasticsearch而不是localhost,两者位于同一 Docker 网络(frontend/backend)之内。与 Elasticsearch/Kibana 版本不匹配:三者共享根
.env的ELK_VERSION。如果你手动修改了某一处的版本,需要重建全部三个服务使镜像重新构建:./laradock rebuild logstash elasticsearch kibana高负载下内存不足:JVM 堆内存固化在 logstash/compose.yml 的
LS_JAVA_OPTS(-Xmx1g -Xms1g),本地处理大规模数据时请直接在该文件上调高,例如改为-Xmx2g -Xms2g。宿主机 5001 端口被占用:该端口硬编码在 logstash/compose.yml 的
ports中,没有对应的.env变量可覆盖。需要释放宿主机端口,或直接编辑该 compose 文件修改映射(例如5002:5001,容器内端口保持 5001 不变)。
串联完整的 ELK 工作流
Logstash 是 ELK 的中间枢纽:Elasticsearch提供搜索与存储后端,Kibana提供数据可视化界面。三者由ELK_VERSION统一版本驱动,组成一条"采集(Beats/MySQL/JDBC)→ 管道处理(Logstash)→ 存储检索(Elasticsearch)→ 可视化(Kibana)"的完整本地日志分析链路。如果你是 Laradock 的新用户,建议先阅读Getting Started完成环境初始化,再按本文步骤从启动 Logstash 开始搭建你的日志管道。
【免费下载链接】laradockFull PHP development environment for Docker. Run Laravel, Symfony, CodeIgniter, Phalcon, WordPress, Drupal, Magento, Moodle, or any PHP project with 70+ pre-configured services: Nginx, Apache, PHP-FPM, MySQL, PostgreSQL, MongoDB, Redis, Elasticsearch & more.项目地址: https://gitcode.com/gh_mirrors/la/laradock
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考