【问题标题】:logstash converting ruby code to logstash filterslogstash 将 ruby​​ 代码转换为 logstash 过滤器
【发布时间】:2021-03-15 06:14:37
【问题描述】:

我想知道在 logstash 中实现以下任务的最佳方法是什么:

我有以下字段,其中包含由“:”划分的多个路径:

my_field : "/var/log/my_custom_file.txt:/var/log/otherfile.log/:/root/aaa.jar

我想添加一个名为“first_file”的新字段,它将仅包含第一个路径的文件名(不带后缀):

first_file : my_custom_file

我用下面的 ruby​​ 代码实现了它;

  code => 'event.set("first_file",event.get("[my_field]").split(":")[0].split("/")[-1].split(".")[0])'

如何使用 logstash 过滤器(add_field、split、grok)来完成相同的任务?我觉得使用 ruby​​ 代码应该是我最后的选择。

【问题讨论】:

  • “:”分隔符的个数总是一样的?
  • 不,它并不总是一样

标签: logstash


【解决方案1】:

你可以只使用 grok 来做到这一点,但我认为使用 mutate 提取第一个值会更清楚

mutate { split => { "my_field" => ":" } }
mutate { replace => "{ "my_field" => "[my_field][0]" } }
grok { match => { "my_field" => "/(?<my_field>[^/]+)\.%{WORD}$" } overwrite => [ "my_field" ] }

而不是

grok { match => { "my_field" => "/(?<my_field>[^/]+)\.%{WORD}:" } overwrite => [ "my_field" ] }

(?[^/]+) 是一种自定义模式(记录在 here),它从一个或多个 (+) 字符序列中创建一个名为 [my_field] 的字段,这些字符不是 /

【讨论】:

  • 你能解释一下 grok 中的正则表达式 /(?[^/]+)\ 吗?
  • 我更新了答案以简要解释自定义模式。
  • 感谢 gr8 的回答和清晰的解释 :)
【解决方案2】:

是的,通过基本的 grok,您可以匹配值中的每个字段。

这种过滤器必须工作(把它放在你的logstash配置文件中),这个提取文件的“basename”(文件名没有扩展名和路径):

filter{
grok {
   match => { "my_field" => "%{GREEDYDATA}/%{WORD:filename}.%{WORD}:%{GREEDYDATA}/%{WORD:filename2}.%{WORD}:%{GREEDYDATA}/%{WORD:filename3}.%{WORD}" }
 }
}

您可以更严格地使用 PATH 代替 GREYDATA,我让您确定适用于您的上下文的最佳方法。

你可以使用在线工具grokdebug调试grok模式。

【讨论】:

  • 如何从 file1 中删除后缀?
  • 您的意思是删除路径的第一部分(在您的情况下为 /var/)?
  • 我的意思是如果第一个文件是 /var/log/mylog.log 我只想得到“mylog”字符串
  • 你如何处理超过 3 个文件的案例?
  • 如果您可以在 grok 或 ruby​​ 之间进行选择,我建议您出于更多原因使用 grok:1) 更少的代码更多的乐趣;) 2) 更少的代码更少的维护 3) 更少的性能泄漏grok 比 ruby​​ 4)更容易阅读(这点可能取决于..)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多