Logstash 配置文件是什么格式?

Logstash 配置文件由 input、filter、output 三段组成,采用类 JSON 的插件语法(插件名 + 键值对)。本文详解三段结构、常用插件与多文件加载规则。

最佳实践
Logstash 配置文件是什么格式?封面

核心结构:Logstash 配置文件(.conf)由 input {}、filter {}、output {} 三个顶级区块组成,这是pipeline DSL,不是YAML;logstash.yml和pipelines.yml才使用YAML。分别定义数据从哪里来、如何加工、发到哪里去;每个区块内部是"插件名 + 键值对"的声明式语法,filter 段可省略。

三段式骨架

input {
  # 输入插件配置
}

filter {
  # 过滤/加工插件配置(可选)
}

output {
  # 输出插件配置
}

input:定义数据来源

一个配置文件可以有多个输入插件:

input {
  file {
    path => "/var/log/syslog"
    start_position => "beginning"
  }
  tcp {
    port => 5140
  }
}

path 指定读取的文件路径;start_position => "beginning" 让首次读取从文件开头开始(默认只读新增内容)。

filter:解析与加工

常用插件包括 grok(正则模式提取)、mutate(字段增删改/类型转换)、date(时间解析)、json(JSON 解析)、geoip(IP 地理信息):

filter {
  grok {
    ecs_compatibility => "disabled"
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  if "_grokparsefailure" not in [tags] and "_groktimeout" not in [tags] and [timestamp] {
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
      locale => "en"
    }
    if "_dateparsefailure" not in [tags] {
      mutate { remove_field => [ "message" ] }
    }
  }
}

此filter演示Apache访问日志,不能直接匹配上面的syslog来源;应按真实输入选模式或用条件分流。filter内插件按书写顺序依次执行,条件判断用 if [level] == "ERROR" { ... }。

output:定义去向

output {
  elasticsearch {
    hosts => ["http://es:9200"]
    index => "app-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }  # 调试期保留,上线前删掉
}

多文件与加载顺序

/etc/logstash/conf.d/ 下的所有 .conf 文件会被按文件名字典序拼接成一个完整管道,不是独立运行。因此常用数字前缀管理顺序:00-inputs.conf、10-filters.conf、30-outputs.conf。

常见问题(FAQ)

Q:filter 段可以不写吗?
A:可以。不加工数据时整个 filter 区块可省略,input 直接进 output。

Q:改完配置如何校验?
A:用 logstash --config.test_and_exit -f /etc/logstash/conf.d/ 做语法检查,通过只证明配置可加载,不验证Grok模式匹配;还需真实成功/失败/超时样本及输出验证后再重启。

Q:一个事件会经过所有 output 吗?
A:会,除非用条件语句分流。事件由某个input产生后进入filter及匹配output,不是依次流过所有input;多个input各自接收数据。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台