You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Logstash从其他字段截取子串生成新字段

解决Logstash提取log.file.path中服务名的问题

需求回顾

需要从log.file.path字段中解析出服务名,新增my.service字段:

"log.file.path": "/var/log/myservice.log"
"my.service": "myservice"

原配置问题分析

你之前的两个过滤器都存在问题:

  • 第一个grok表达式%{GREEDYDATA}/(?<my.service>).log中,(?<my.service>)未指定匹配规则,无法捕获任何内容;
  • 第二个grok表达式%{GREEDYDATA}/%{GREEDYDATA:my.service}.log未对.转义(正则中.匹配任意字符),且GREEDYDATA可能匹配到非预期内容;
  • 条件判断if ("" in [log.file.path])逻辑无效,空字符串存在于任何字符串中,该条件始终为真,应改为判断字段是否存在。

正确配置方案

方案1:使用Grok插件

filter {
    # 仅当log.file.path字段存在时执行解析
    if [log.file.path] {
        grok {
            match => { "log.file.path" => ".*/%{DATA:my.service}\\.log$" }
        }
    }
}
  • .*/匹配路径中最后一个斜杠之前的所有内容;
  • %{DATA:my.service}匹配文件名(非换行符的任意字符);
  • \.log$精准匹配结尾的.log,$确保匹配到路径末尾。

方案2:使用Dissect插件(更简洁)

Dissect无需正则,语法更直观:

filter {
    if [log.file.path] {
        dissect {
            mapping => { "log.file.path" => "%{*}/%{my.service}.log" }
        }
    }
}
  • %{*}表示忽略斜杠之前的所有内容;
  • %{my.service}直接提取出.log前的服务名。

内容的提问来源于stack exchange,提问作者Ror

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:35:02