使用 grok 和 ruby 提取和自定义字段的 Logstash

Logstash extracting and customizing field with grok and ruby

我将弹性搜索日志中的这些数据保存在 referer 字段中

/clientReq?sessionid=3332&UID=ed91b-517234-4f4c211-a20e-d2e1aefc126a&signUp=false

我想使用 ruby 将此数据 ed91b-517234-4f4c211-a20e-d2e1aefc126a 保存在单独的字段中。

我已经在我的模式配置文件 ruby 中尝试过,

ruby {
 code => "
    saveid=event[referer].match((\w+[-]?)+)+)
    event.set('saved',saveid)   "
}

这甚至没有保存整个文件。所以我继续尝试 grok 过滤器并尝试了这个,

grok {
    match => {"message" => "%{COMBINEDAPACHELOG}"}
    add_field => { "savedData" => "%{referer}" }
}

这些都不起作用。我已经测试了配置,如果配置成功。当我访问 kibana 前端时,我也没有看到创建的新字段。

Ruby 哈希语法 event[field] = foo 不再使用,已被 Get API 取代,例如 event.get(referrer).

除此之外,您的正则表达式不正确,无法获得所需的结果。解决方案之一是使用 Positive Lookbehind 检查 UID,

这应该有效,

ruby {
 code => "
    saveid = event.get('referer').match(/(?<=UID=)((\w+[-]?)+)+/)[1]
    event.set('saved',saveid)
    "
}

对于 grok,您可以为 referer 字段创建一个新的 filter,并使用 gork's predefined UUID pattern 来匹配您的字符串。 .你能试试这个吗,

grok {
  match => {"referer" => "UID=%{UUID:saveData}"}
}

希望这对您有所帮助。