logstash将ruby代码转换为logstash过滤器

logstash将ruby代码转换为logstash过滤器,logstash,Logstash,我想知道在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.

我想知道在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过滤器(添加字段、拆分、grok)执行相同的任务?我觉得使用ruby代码应该是我最后的选择。

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

这种过滤器必须工作(将其放在日志存储配置文件中),这种过滤器提取文件的“basename”(文件名不带扩展名和路径):

在grok中,您可以更严格地使用PATH来代替GREYDATA,我让您确定在您的上下文中工作的最佳方法


您可以使用联机工具调试grok模式。

是的,使用基本grok,您可以匹配值中的每个字段

这种过滤器必须工作(将其放在日志存储配置文件中),这种过滤器提取文件的“basename”(文件名不带扩展名和路径):

在grok中,您可以更严格地使用PATH来代替GREYDATA,我让您确定在您的上下文中工作的最佳方法


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

您可以只使用grok进行调试,但我认为使用mutate提取第一个值会更清晰

mutate { split => { "my_field" => ":" } }
mutate { replace => "{ "my_field" => "[my_field][0]" } }
grok { match => { "my_field" => "/(?<my_field>[^/]+)\.%{WORD}$" } overwrite => [ "my_field" ] }
mutate{split=>{“我的_字段”=>“:”}
变异{replace=>“{”my_field“=>“[my_field][0]”}
grok{match=>{“我的字段”=>“/(?[^/]+)\.%{WORD}$“}覆盖=>[“我的字段”]}
而不是

grok { match => { "my_field" => "/(?<my_field>[^/]+)\.%{WORD}:" } overwrite => [ "my_field" ] }
grok{match=>{“我的字段”=>“/(?[^/]+)\.%{WORD}:“}覆盖=>[“我的字段”]}

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

您可以使用grok来完成,但我认为使用mutate来提取第一个值会更清楚

mutate { split => { "my_field" => ":" } }
mutate { replace => "{ "my_field" => "[my_field][0]" } }
grok { match => { "my_field" => "/(?<my_field>[^/]+)\.%{WORD}$" } overwrite => [ "my_field" ] }
mutate{split=>{“我的_字段”=>“:”}
变异{replace=>“{”my_field“=>“[my_field][0]”}
grok{match=>{“我的字段”=>“/(?[^/]+)\.%{WORD}$“}覆盖=>[“我的字段”]}
而不是

grok { match => { "my_field" => "/(?<my_field>[^/]+)\.%{WORD}:" } overwrite => [ "my_field" ] }
grok{match=>{“我的字段”=>“/(?[^/]+)\.%{WORD}:“}覆盖=>[“我的字段”]}


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

的数目”:“分隔符总是相同的?不,它不总是相同的”:分隔符总是一样的?不,它并不总是一样的我如何从文件1中删除后缀?你的意思是删除路径的第一部分(在你的例子中是/var/)?我的意思是,如果第一个文件是/var/log/mylog.log,我只想得到“mylog”字符串,你如何处理一个有3个以上文件的情况?如果你可以选择grok还是ruby,我建议您使用grok的原因更多:1)代码越少,乐趣越大;)2) 更少的代码更少的维护3)使用grok比ruby更不可能出现性能泄漏4)更容易读取(这一点可能取决于..)如何从文件1中删除后缀?您的意思是删除路径的第一部分(在您的情况下是/var/)?我的意思是,如果第一个文件是/var/log/mylog.log,我只想获得“mylog”stringAnd你如何处理一个有3个以上文件的案例?如果你可以选择grok还是ruby,我建议你使用grok有更多的理由:1)代码越少越好;)2) 更少的代码更少的维护3)grok比ruby 4更容易出现性能泄漏(这一点可能取决于…)你能解释一下grok中的regex/(?[^/]+)\吗?我更新了答案,简要解释了自定义模式。感谢你给出的gr8答案和清晰的解释:)你能解释一下regex/(?)?[^/]+)\在grok?中,我更新了答案,简要解释了自定义模式。感谢您提供gr8答案和清晰的解释:)