Logstash 采集文件时如何把文件名加为字段?

Logstash file input 在 ECS 模式下使用 [log][file][path],禁用 ECS 时使用 path;用 grok 从路径提取文件名段即可得到文件名字段。本文给出 grok 模式与多目录场景的用法。

最佳实践
Logstash 采集文件时如何把文件名加为字段?封面

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 只影响首次发现;没有新读取事件时自然不会产生新字段。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台