Logstash 如何把文件名添加为日志字段?
Logstash 的 file input 默认把文件路径存在 path 字段,用 grok 从 path 提取文件名、或用 mutate+split 切分路径,即可把文件名作为独立字段。本文给出两种写法。
file input 采集的每条日志自带 path 字段(完整路径)——用 grok 从路径末尾提取文件名写入新字段即可:%{GREEDYDATA}/%{NOTSPACE:filename} 或 mutate split 取数组末位。
方法一:grok 提取
filter {
grok {
match => { "path" => "%{GREEDYDATA}/%{NOTSPACE:log_filename}" }
}
}
/var/log/app/order-2024-01-15.log → log_filename = order-2024-01-15.log。
方法二:mutate split
filter {
mutate {
add_field => { "log_filename" => "%{path}" }
}
mutate {
split => { "log_filename" => "/" }
}
# 取数组最后一个元素需要 ruby 过滤器
ruby {
code => 'event.set("log_filename", event.get("log_filename").last)'
}
}
grok 写法更简洁,推荐方法一。
典型用途
- 按文件名区分日志来源(同一目录下多个应用);
- 从文件名提取日期/业务线等元数据做标签;
- 排查"哪个文件在刷屏"。
观测云对照
观测云 DataKit 的文件日志采集自动附带文件名与路径属性,在日志查看器中可直接按文件维度筛选聚合,无需配置提取规则。
常见问题(FAQ)
Q:path 字段里没有文件名只有目录? 检查 file input 的 path 配置是否用了通配符——path 字段总是完整路径。
Q:Windows 路径分隔符是反斜杠? grok 模式改为 [\\/] 兼容两种分隔符。