Laradock 中的 Logstash:搭建 ELK 日志管道的完整实战指南
2026/9/23 17:43:38 网站建设 项目流程

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文件。它的镜像构建依赖根.envELK_VERSION变量,而端口与 JVM 堆内存则直接固化在 logstash/compose.yml 中,未暴露为.env变量:

配置项设置位置
端口映射5001:5001logstash/compose.yml
LS_JAVA_OPTS-Xmx1g -Xms1glogstash/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挂接在frontendbackend两个 Laradock 自定义网络上(这两个网络定义在根 docker-compose.yml 中)。这也是 Logstash 与其他容器通信的基础:在管道配置中访问 Elasticsearch 必须使用容器名elasticsearch,而不是localhost

配置 Logstash 管道

Logstash 的运行由两个挂载进容器的部分驱动:

  1. 服务器配置logstash/config/logstash.yml,挂载到容器内/usr/share/logstash/config/logstash.yml
  2. 管道目录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 版本不匹配:三者共享根.envELK_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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询