我正试图创建自定义的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行将返回:
- 附表0001
- OrderInterfaceIntServer
- "quot
在日志中:
- SERVICE将始终以";线程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模式以获得我需要的结果。
您不必将所有模式都包含在捕获组中。你可以使用
grok { match => { "message" => "Thread-[0-9]{2}_(?<service>.*?):" } }
这将导致
"service" => "SCHEDULE.0001",
"service" => "OrderInterfaceIntServer",
和一个"_grokparsefailure";标记。