Logstash 如何把文件名添加为日志字段?
Logstash 的 file input 在非 ECS 模式把文件路径存在 path 字段,ECS 模式使用 [log][file][path],用 grok 从 path 提取文件名、或用 mutate+split 切分路径,即可把文件名作为独立字段。本文给出两种写法。
file input 采集的在非 ECS 模式通常提供 path,ECS 模式通常提供 [log][file][path](完整路径)——用 grok 从路径末尾提取文件名写入新字段即可:^%{GREEDYDATA}/(?<filename>[^/]+)$ 或 mutate split 取数组末位。
方法一:grok 提取
filter {
grok {
match => { "path" => "^%{GREEDYDATA}/(?<log_filename>[^/]+)$" }
}
}
/var/log/app/order-2024-01-15.log → log_filename = order-2024-01-15.log。
方法二:mutate split
filter {
mutate {
copy => { "path" => "log_filename" }
}
mutate {
split => { "log_filename" => "/" }
}
# 取数组最后一个元素需要 ruby 过滤器
ruby {
code => 'v = event.get("log_filename"); event.set("log_filename", v.last) if v.is_a?(Array) && !v.empty?'
}
}
以上配置以非 ECS 的 POSIX 路径为例;ECS 时把 path 引用改为 [log][file][path]。grok 写法更简洁,推荐方法一。
典型用途
- 按文件名区分日志来源(同一目录下多个应用);
- 从文件名提取日期/业务线等元数据做标签;
- 排查"哪个文件在刷屏"。
常见问题(FAQ)
Q:path 字段里没有文件名只有目录? 先确认字段是否被覆盖、ECS 模式和实际事件;通配符输入仍应带具体文件路径,字段不存在/非字符串时不能直接提取。
Q:Windows 路径分隔符是反斜杠? grok 模式改为 [\\/] 兼容两种分隔符。