如何在logstash的grok模式中使用IF-ELSE条件

如何在logstash的grok模式中使用IF-ELSE条件,logstash,elastic-stack,logstash-grok,logstash-configuration,Logstash,Elastic Stack,Logstash Grok,Logstash Configuration,我将web和API日志合并在一起,我想将其分别保存在elasticsearch中。所以我想写一个模式,如果请求是针对API的,那么如果过去应该执行,请求是web的,那么应该执行日志的其他部分 下面是一些web和API日志 00:06:27,778 INFO [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.777 [ajp--0.0.0.0-8009-38] INFO c.r.s.web.rest.WidgetController - Method getWi

我将web和API日志合并在一起,我想将其分别保存在elasticsearch中。所以我想写一个模式,如果请求是针对API的,那么如果过去应该执行,请求是web的,那么应该执行日志的其他部分

下面是一些web和API日志

00:06:27,778 INFO  [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.777 [ajp--0.0.0.0-8009-38] INFO  c.r.s.web.rest.WidgetController - Method getWidgetDetails() started to get widget details.
00:06:27,783 INFO  [stdout] (ajp--0.0.0.0-8009-38) ---> HTTP GET http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true
00:06:27,817 INFO  [stdout] (ajp--0.0.0.0-8009-38) <--- HTTP 200 http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true (29ms)
00:06:27,822 INFO  [stdout] (ajp--0.0.0.0-8009-38) 00:06:27.822 [ajp--0.0.0.0-8009-38] INFO  c.r.s.web.rest.WidgetController - Method getWidgetDetails() finished.
00:06:27,899 INFO  [stdout] (ajp--0.0.0.0-8009-40) 00:06:27.899 [ajp--0.0.0.0-8009-40] INFO  c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController

有人能给我一些建议吗?

你不需要使用
如果要这样做,你可以使用多个模式,一个匹配API日志行,另一个匹配WEB日志行

对于API日志行,可以使用以下模式:

(?:%{TIME:CREATED{u ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\({NOTSPACE:THREAD})%{SPACE}(?:%{DATA})%{SPACE}\[%{DATA}\]%{SPACE SPACE}%{WORD}%{SPACE WORD}%{SPACE}%{greedydydata MSG}

您的回报将是这样的:

{
"MSG": "c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController",
"CREATED_ON": "00:06:27,899",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-40"
}
对于web线路,您可以使用以下模式:

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\({NOTSPACE:THREAD})%{SPACE}%{DATA}%{WORD PROTOCOL}%{SPACE}%{WORD MethodOrStatus}%{SPACE}%{SPACE}%{greedydydata:ENDPOINT}

结果将是:

{
"CREATED_ON": "00:06:27,783",
"PROTOCOL": "HTTP",
"ENDPOINT": "http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-38",
"MethodOrStatus": "GET"
}
要在grok中使用多个模式,只需执行以下操作:

grok {
  match => ["message", "pattern1", "pattern2"]
}
或者,您可以将模式保存到文件中,并使用
patterns\u dir
指向文件的目录

如果仍要使用条件,只需检查消息中的任何内容,例如:

if "HTTP" in [message] { 
 grok { your grok for the web messages }
} else {
 grok { your grok for the api messages }
}

您不需要使用
if/else
条件来执行此操作,您可以使用多个模式,一个匹配API日志行,另一个匹配WEB日志行

对于API日志行,可以使用以下模式:

(?:%{TIME:CREATED{u ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\({NOTSPACE:THREAD})%{SPACE}(?:%{DATA})%{SPACE}\[%{DATA}\]%{SPACE SPACE}%{WORD}%{SPACE WORD}%{SPACE}%{greedydydata MSG}

您的回报将是这样的:

{
"MSG": "c.r.s.web.controller.LoginController - Inside initLoginPage() of LoginController",
"CREATED_ON": "00:06:27,899",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-40"
}
对于web线路,您可以使用以下模式:

(?:%{TIME:CREATED_ON})(?:%{SPACE})%{WORD:LEVEL}%{SPACE}\[%{NOTSPACE}\]%{SPACE}\({NOTSPACE:THREAD})%{SPACE}%{DATA}%{WORD PROTOCOL}%{SPACE}%{WORD MethodOrStatus}%{SPACE}%{SPACE}%{greedydydata:ENDPOINT}

结果将是:

{
"CREATED_ON": "00:06:27,783",
"PROTOCOL": "HTTP",
"ENDPOINT": "http://api.survey.me/v1/getwidgetdetails?profileName=jeremy-steffens&profileLevel=INDIVIDUAL&companyProfileName=premier-nationwide-lending&hideHistory=true",
"LEVEL": "INFO",
"THREAD": "ajp--0.0.0.0-8009-38",
"MethodOrStatus": "GET"
}
要在grok中使用多个模式,只需执行以下操作:

grok {
  match => ["message", "pattern1", "pattern2"]
}
或者,您可以将模式保存到文件中,并使用
patterns\u dir
指向文件的目录

如果仍要使用条件,只需检查消息中的任何内容,例如:

if "HTTP" in [message] { 
 grok { your grok for the web messages }
} else {
 grok { your grok for the api messages }
}

谢谢你的帮助,我试过了,但它没有给我任何错误,也没有在elasticsearch中创建任何索引。我不能在这里发布我的配置文件,所以我将它发布到下面的答案部分。请确认它是否正确。感谢您的帮助,我尝试了,但没有给我任何错误,也没有在elasticsearch中创建任何索引。我不能在这里发布我的配置文件,所以我将它发布到下面的答案部分。请确认它是否正确。