跳转至

logstash多管道配置

当logstash需要处理多个配置文件的输入输出时,为了避免单管道处理冲突与重复,我们需要启用多管道配置

现在需要处理mysql-audit、nginx、system三个配置文件的日志,之前启用的默认管道配置。当多个输入进入同一个pipeline时,默认情况下所有过滤器都会应用到每个事件上,经过配置文件过滤输出到ES时,生成3条重复日志(因为配置文件有三个,端口也是三个)

现在配置(默认main管道):

Bash
root@pts/0 # ls /etc/logstash/conf.d/
mysql-log.conf  nginx-log.conf  system-log.conf
  1. mysql 使用5044端口
  2. nginx 使用5045端口
  3. system 使用5046端口

优化

使用单独管道,为每种日志类型创建独立的pipeline

首先修改logstash.yml启用多管道

Bash
1
2
3
4
5
6
7
8
pipeline.workers: 3
pipeline.batch.size: 125
#注释掉默认配置目录,防止自动加载单管道配置文件
#path.config: /etc/logstash/conf.d/*.conf

# 监控与API
http.host: "0.0.0.0"
http.port: 9600

创建配置文件目录

将conf.d 目录下配置文件mv 到新目录,确保conf.d目录空

Logstash 会加载 conf.d/ 下所有 .conf 文件,即使已配置多管道。务必移除非管道化配置 在 Logstash 7.6.1 中,当 conf.d 目录存在时,它会自动加载该目录下的所有 .conf 文件,这会覆盖 pipelines.yml 的配置 即使注释掉 path.config,Logstash 7.6.1 仍会 默认扫描 conf.d 目录(这是内置行为) 如果检测到 conf.d 目录中有 .conf 文件,Logstash 会 自动退回到单管道模式 pipelines.yml 的优先级 低于 自动发现的配置文件

Bash
mkdir /etc/logstash/config
mv /etc/logstash/conf.d/* /etc/logstash/config/

创建管道配置文件pipelines.yml

Bash
#注释掉默认的管道配置
#- pipeline.id: main
#  path.config: "/etc/logstash/conf.d/*.conf"
#为每个配置文件启用单独管道
- pipeline.id: mysql
  path.config: "/etc/logstash/config/mysql-log.conf"
  pipeline.workers: 1
  #queue.type: persisted  # 启用持久化队列
  #queue.max_bytes: 4gb   # 队列最大容量(建议设为磁盘空间的20%)
  #queue.checkpoint.acks: 1024  # 每处理1024个事件做一次检查点
- pipeline.id: nginx
  path.config: "/etc/logstash/config/nginx-log.conf"
  pipeline.workers: 1
- pipeline.id: system
  path.config: "/etc/logstash/config/system-log.conf"
  pipeline.workers: 1

queue.type: persisted 会启用 磁盘持久化队列,主要解决两个关键问题:

  1. 数据防丢失:当 Logstash 崩溃或重启时,内存中未处理的事件不会丢失
  2. 流量峰谷缓冲:在突发高流量时,自动将数据暂存到磁盘,避免内存溢出

何时必须启用磁盘持久化队列

强烈建议在以下场景启用:

  1. 处理关键业务日志(如订单、支付日志)
  2. 网络不稳定的环境(ES 集群可能临时不可用)
  3. 有突发流量场景(如促销活动时日志量激增)

性能影响说明

  1. 写入性能:会有5-15%的性能下降(因需要写磁盘)
  2. 资源消耗:
    • 额外占用约 200MB 内存(用于队列管理)
    • 需要保证磁盘有足够空间(建议单独挂载高速磁盘)

如果想显式控制顺序性,可以在 logstash.yml 中添加

Bash
1
2
3
4
5
6
# 自动选择(推荐默认)
pipeline.ordered: auto  
# 或 强制顺序(影响性能,仅需严格顺序时使用)
pipeline.ordered: true  
# 或 强制顺序(影响性能,仅需严格顺序时使用)
pipeline.ordered: false  

启用了多管道,也可以在pipelines.yml中单独配置

Bash
1
2
3
4
- pipeline.id: nginx
  path.config: "/etc/logstash/config/nginx-log.conf"
  pipeline.workers: 1
  pipeline.ordered: false  # Nginx 日志无需顺序
  1. pipeline.ordered: autoLogstash 自动选择顺序/并行的模式(推荐默认)。
  2. 如果数据需要严格顺序(如 MySQL binlog),设为 true;否则用 false 提高性能。

监控方法

curl -s http://localhost:9600/_node/stats/pipelines?pretty | jq '.pipelines'