【发布时间】:2020-08-28 19:12:12
【问题描述】:
我的日志文件行如下所示。
[2020-07-10T10:00:04.979+00:00] [app_server1] [NOTIFICATION] [report-thread] [tid: 1346887] [userId: user10.id2] start-getchunk: Report=/Report Folder Path/Report name, TemplateName=Template1004, OutFormat=excel, Locale=en_US
[2020-07-10T10:00:25.085+00:00] [app_server2] [NOTIFICATION] [report-thread] [tid: 1346887] [userId: user1.id1] end-getchunk: Report=/Report Folder Path/Report name, TemplateName=Template2007, OutFormat=html, Locale=en_US
[2020-07-10T10:00:25.080+00:00] [app_server2] [NOTIFICATION] [report-thread] [tid: 1346887] [userId: user2.id1][
Start report processing details
-----------------------------------------------------
Report path: /Report Folder Path/Report name
Datamodel name: /Report Folder Path/Datamodel name
User name: user2
Output format: 1
chunk size limit: 524288000
-----------------------------------------------------
End report processing details
]
[Log lines with some other patterns]
我想在我的 logstash 配置文件中使用以下类型的匹配模式来匹配不同的行。
(a) match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] \[] \[%{DATA:thread_type}\] \[tid: %{NUMBER:tid}\] \[userId: %{DATA:userId}\] (?<event_type>\sstart-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
(b) match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] \[] \[%{DATA:thread_type}\] \[tid: %{NUMBER:tid}\] \[userId: %{DATA:userId}\] (?<event_type>\send-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
(c) to match a multiline having this match
break_on_match => false
match => {
"message => [
"Report path: (?<report_path>[^,\r\n]*)",
"Datamodel name: (?<datamodel_name>[^,\r\n]*)",
"User name: (?<user_name>[^,\r\n]*)",
(?<event_type>Start report processing details)
]
}
(d) other n numbers of matches like the one mentioned in points (a) & (b) above
现在,假设我的配置中只有 (a)、(b) 和 (c)。
我的配置如下所示(“match =>”行的顺序发生了变化)。
filter{
grok{
break_on_match => false
## single grok pattern match
match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] \[] \[%{DATA:thread_type}\] \[tid: %{NUMBER:tid}\] \[userId: %{DATA:userId}\] (?<event_type>\sstart-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] \[] \[%{DATA:thread_type}\] \[tid: %{NUMBER:tid}\] \[userId: %{DATA:userId}\] (?<event_type>\send-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
## multple grok pattern match
match => {
"message => [
"Report path: (?<report_path>[^,\r\n]*)",
"Datamodel name: (?<datamodel_name>[^,\r\n]*)",
"User name: (?<user_name>[^,\r\n]*)",
(?<event_type>Start report processing details)
]
}
}
}
现在问题陈述:- 配置仅匹配配置文件中提到的三个“match =>”中的最后一个的模式。 所以,如果在配置文件中
[A] the sequence of "match =>" lines are (a) -> (b) -> (c) (as shown in above config): it matches patterns for only (c).
[B] the sequence of "match =>" lines are (c) -> (b) -> (a): it matches patterns for only (a).
[C] the sequence of "match =>" lines are (c) -> (a) -> (b): it matches patterns for only (b).
但是,我希望在输入中匹配所有 (a)、(b)、(c)。
另外,我想保持 (a)、(b)、(c) 的匹配模式不变。 实际上,对于 (c),我有一个像 (a) 和 (b) 这样的 grok 模式。那时配置试图匹配所有 (a)、(b) 和 (c)。但由于 (c) 出现“_groktimeout”错误,将模式更改为 (c) 中提到的模式 Ref。
为了解决这个问题,我尝试了
- 同一过滤器下的多个 grok{} 块{} 块 AND
- 多个过滤器{} 块在同一个配置文件中 通过将“(a),(b)”和“(c)”拆分为单独的块来解决问题。但在上述两种情况下,它并没有产生任何输出。
我尝试了另一个选项,如下所示。这可行,但这不是一个性能有效的选择。 因此在不使用“if”条件中的 grok 的情况下寻找更好、性能更高效的选项。
filter{
grok{
## single grok pattern match
match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] \[] \[%{DATA:thread_type}\] \[tid: %{NUMBER:tid}\] \[userId: %{DATA:userId}\] (?<event_type>\sstart-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] \[] \[%{DATA:thread_type}\] \[tid: %{NUMBER:tid}\] \[userId: %{DATA:userId}\] (?<event_type>\send-getchunk): Report=(?<report_name>[^,]*), TemplateName=(?<template_name>[^,]*), OutFormat=(?<output_format>[^,]*), Locale=(?<locale>[^,]*)" }
match => { "message" => "\[%{TIMESTAMP_ISO8601:process_timstamp}\] \[%{WORD:app_server}] \[%{WORD:log_level}] %{GREEDYDATA}(?<event_type>Start report processing details)"}
if " Start report processing details" in [event_type]{
grok {
break_on_match => false
## multple grok pattern match
match => {
"message => [
"Report path: (?<report_path>[^,\r\n]*)",
"Datamodel name: (?<datamodel_name>[^,\r\n]*)",
"User name: (?<user_name>[^,\r\n]*)",
(?<event_type>Start report processing details)
]
}
}
}
}
}
我的预期输出如下所示,为此我删除了配置文件中的几个字段。
{"tags":["reportlog"],"userId":"user10.id2","process_timestamp":"2020-07-10T10:00:25.085+00:00","thread_type":"report-thread","template_name":"Template2007","log_level":"NOTIFICATION","event_type":"end-getchunk","output_format":"html","tid":"199163","app_server":"app_server2","report_name":"/Report Folder Path/Report name"}
{"tags":["reportlog"],"userId":"user1.id1","process_timestamp":"2020-07-10T10:00:04.979+00:00","thread_type":"report-thread","template_name":"Template1004","log_level":"NOTIFICATION","event_type":"start-getchunk","output_format":"excel","tid":"800760","app_server":"app_server1","report_name":"/Report Folder Path/Report name"}
{"tags":["multiline","reportlog"],"userId":["user2.id1"],"report_path":"/Report Folder Path/Report name", "process_timestamp":["2020-07-10T10:00:25.080+00:00"],"datamodel_name":"/Report Folder Path/Datamodel name","thread_type":"report-thread","log_level":"NOTIFICATION","event_type":"Start report processing details","tid":["812409"],"app_server":"app_server2"}
【问题讨论】:
-
使用您要解析的消息示例和预期结果更新您的问题。没有看到您的消息看起来如何,很难看出问题所在。
-
@leandrojmp,更新了问题。但基本上我希望提到的所有三个过滤器 (a)、(b)、(c) 都可以过滤来自输入文件的消息。