logstash 自定义grok模式中的正则表达式组

wb1gzix0  于 2022-12-09  发布在  Logstash
关注(0)|答案(1)|浏览(167)

我正在尝试创建自定义grok模式来使用logstash提取各种数据,并且绞尽脑汁来获得正确的语法,以便从我的日志行中提取regex group 1等价项。在过去的两天里,我已经查看了大量关于这方面的线程,但没有一个适合我的示例,而且没有一个现成的grok模式看起来会提取我需要的值。
3个示例日志文件行类似于下图(示例中使用缩写数据):

2022-04-07 12:52:06,184:INFO   :Thread-70_SCHEDULE.0001: MsgID=63759111848731967
2022-04-07 07:23:39,876:INFO   :Thread-53_OrderInterfaceIntServer: MsgID=21316889724753182|
07:23:40,482 INFO  [stdout] (http-/0.0.0.0:8080-20) 2022-04-07 07:23:40,482:ERROR

我想创建一个名为SERVICE的自定义grok模式,它使用正则表达式匹配字符串提取模式匹配:

Thread-[0-9]{2}_(.*?)\:

对于3行,将返回:

  • SCHEDULE.0001
  • 订单接口IntServer
  • ““

在日志中:

  • SERVICE将始终以“Thread-xx_”为前缀,其中xx =后跟下划线的2位数字。某些日志可能根本没有此模式(如行3)。在这种情况下,没有匹配项。
  • SERVICE后面总是跟一个冒号

在grok中,我可以用两种方式来定义:

SERVICE Thread-[0-9]{2}_(.*?)\:
or as a field using (?<service>Thread-[0-9]{2}_(.*?)\:)

但是,对于第1行,我得到的响应值为:

{
  "service": [
    [
      "Thread-70_SCHEDULE.0001:"
    ]
  ]
}

我要的是:

{
  "service": [
    [
      "SCHEDULE.0001"
    ]
  ]
}

这相当于regex组1的响应。我不知道如何管理grok模式来获得我需要的结果。

h6my8fg2

h6my8fg21#

您不需要在撷取群组中包含所有的样式。您可以使用

grok { match => { "message" => "Thread-[0-9]{2}_(?<service>.*?):" } }

这将导致

"service" => "SCHEDULE.0001",

   "service" => "OrderInterfaceIntServer",

和第三个事件上的“_grokparsefailure”标记。

相关问题