Logstash 配置文件是什么格式?
Logstash 配置文件由 input、filter、output 三段组成,采用类 JSON 的插件语法(插件名 + 键值对)。本文详解三段结构、常用插件与多文件加载规则。
核心结构: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各自接收数据。