Logstash 采集文件时如何把文件名加为字段?
Logstash file input 在 ECS 模式下使用 [log][file][path],禁用 ECS 时使用 path;用 grok 从路径提取文件名段即可得到文件名字段。本文给出 grok 模式与多目录场景的用法。
file input 在 ECS 兼容模式下使用 [log][file][path],禁用 ECS 时使用顶层 path(如 /var/log/app/order.log)——用 grok 从路径中提取最后的文件名片段即可:\A(?:.*/)?(?<filename>[^/]+)\z(POSIX 路径)。
配置示例
input {
file {
path => "/var/log/app/*.log"
start_position => "beginning"
ecs_compatibility => "disabled" # 本例明确使用顶层 path
}
}
filter {
grok {
match => { "path" => '\A(?:.*/)?(?<filename>[^/]+)\z' }
}
}
只想要文件名不要扩展名
grok {
match => { "path" => '\A(?:.*/)?(?<filename_base>[^/]+)\.log\z' }
}
按文件名分流到不同索引
文件名可能包含非法索引字符或制造高基数索引,使用受控白名单前缀。下例是普通索引模式,不适用于同时由 ILM rollover alias 或 data stream 管理的目标。
filter {
if [filename] == "order.log" {
mutate { add_field => { "[@metadata][index_prefix]" => "orders" } }
} else {
mutate { add_field => { "[@metadata][index_prefix]" => "application" } }
}
}
output {
elasticsearch {
hosts => ["es:9200"]
index => "%{[@metadata][index_prefix]}-%{+yyyy.MM.dd}"
ilm_enabled => false
data_stream => false
}
}
常见问题(FAQ)
Q:Windows 路径怎么写? 正则中用 [\\/] 同时兼容正斜杠与反斜杠。
Q:sincedb 记录会影响吗? 不改变路径字段的语义,但 sincedb 决定读取从哪继续,start_position 只影响首次发现;没有新读取事件时自然不会产生新字段。