Logstash 如何把文件名添加为日志字段?

Logstash 的 file input 在非 ECS 模式把文件路径存在 path 字段,ECS 模式使用 [log][file][path],用 grok 从 path 提取文件名、或用 mutate+split 切分路径,即可把文件名作为独立字段。本文给出两种写法。

最佳实践
Logstash 如何把文件名添加为日志字段?封面

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 模式改为 [\\/] 兼容两种分隔符。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台