Logstash Grok 解析问题
Logstash Grok Parsing Issue
我正在使用 Logstash 读取一些日志文件。
下面是一些数据源记录
<2016-07-07 00:31:01> Start
<2016-07-07 00:31:59> Warning - Export_Sysem 6 (1) => No records to be exported
<2016-07-07 00:32:22> Export2CICAP (04) => Export PO : 34 record(s)
<2016-07-07 00:32:22> Export2CICAP (04) => Export CO : 87 record(s)
<2016-07-07 00:32:22> Export2CICAP (04) => Export FC
这是我的配置文件
grok{
match => {"message" => [
'<%{TIMESTAMP_ISO8601:Timestamp}> (%{WORD:Level} - )%{NOTSPACE:Job_Code} => %{GREEDYDATA:message}',
'<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Parameter} - %{GREEDYDATA:Message}',
'<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Status}',
]}
}
这是我输出的一部分
{
"message" => "??2016-07-07 00:31:01> Start\r?",
"@version" => "1",
"@timestamp" => "2016-07-08T03:22:01.076Z",
"path" => "C:/CIGNA/Export.log",
"host" => "SIMSPad",
"type" => "txt",
"tags" => [
[0] "_grokparsefailure"
]
}
{
"message" => "<2016-07-07 00:31:59> Warning - Export_Sysem 6 (1) => No records to be exported\r?",
"@version" => "1",
"@timestamp" => "2016-07-06T16:31:59.000Z",
"path" => "C:/CIGNA/Export.log",
"host" => "SIMSPad",
"type" => "txt",
"Timestamp" => "2016-07-07 00:31:59",
"Parameter" => "Warning",
"Message" => "Export_Sysem 6 (1) => No records to be exported\r?"
}
{
"message" => "<2016-07-07 00:32:22> Export2CICAP (04) => Export CO : 87 record(s)\r?",
"@version" => "1",
"@timestamp" => "2016-07-06T16:32:22.000Z",
"path" => "C:/CIGNA/Export.log",
"host" => "SIMSPad",
"type" => "txt",
"Timestamp" => "2016-07-07 00:32:22",
"Status" => "Export2CICAP"
}
从输出中可以看出,第一条输出消息存在 grok 解析错误,其他 2 个结果未完全解析消息。我应该如何修改我的 grok 语句以便它可以完全解析消息?
对于第一条消息,问题出在没有出现在模式中的两个 ??
,因此创建了 _grokparsefailure
.
第二条和第三条消息未完全解析,因为前两个模式与消息不匹配,因此消息由最后一个模式解析。
对于第二条消息,如果你想用第一个模式(<%{TIMESTAMP_ISO8601:Timestamp}> (%{WORD:Level} - )%{NOTSPACE:Job_Code} => %{GREEDYDATA:message}
)解析它,你的模式是错误的:
()
%{WORD:Level} -
左右没有出现在日志中。
:Timestamp}>
和%{WORD:Level}
之间少了一个space。在日志中有两个,模式中只有一个。请注意,您可以使用 %{SPACE}
来避免此问题(因为 %{SPACE}
将匹配任意数量的 space)
%{NOTSPACE:Job_Code}
匹配一个没有space的字符序列,但是Export_Sysem 6 (1)
中有一个space,所以Job_Code
会是Export_Sysem
和模式中的 =>
将阻止与第一个模式的成功匹配。
正确的模式:
<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Level} - %{DATA:Job_Code} => %{GREEDYDATA:message}
对于第三条消息,我看不出应该使用哪种模式。
如果您添加更多详细信息,我会更新我的答案。
我正在使用 Logstash 读取一些日志文件。 下面是一些数据源记录
<2016-07-07 00:31:01> Start
<2016-07-07 00:31:59> Warning - Export_Sysem 6 (1) => No records to be exported
<2016-07-07 00:32:22> Export2CICAP (04) => Export PO : 34 record(s)
<2016-07-07 00:32:22> Export2CICAP (04) => Export CO : 87 record(s)
<2016-07-07 00:32:22> Export2CICAP (04) => Export FC
这是我的配置文件
grok{
match => {"message" => [
'<%{TIMESTAMP_ISO8601:Timestamp}> (%{WORD:Level} - )%{NOTSPACE:Job_Code} => %{GREEDYDATA:message}',
'<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Parameter} - %{GREEDYDATA:Message}',
'<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Status}',
]}
}
这是我输出的一部分
{
"message" => "??2016-07-07 00:31:01> Start\r?",
"@version" => "1",
"@timestamp" => "2016-07-08T03:22:01.076Z",
"path" => "C:/CIGNA/Export.log",
"host" => "SIMSPad",
"type" => "txt",
"tags" => [
[0] "_grokparsefailure"
]
}
{
"message" => "<2016-07-07 00:31:59> Warning - Export_Sysem 6 (1) => No records to be exported\r?",
"@version" => "1",
"@timestamp" => "2016-07-06T16:31:59.000Z",
"path" => "C:/CIGNA/Export.log",
"host" => "SIMSPad",
"type" => "txt",
"Timestamp" => "2016-07-07 00:31:59",
"Parameter" => "Warning",
"Message" => "Export_Sysem 6 (1) => No records to be exported\r?"
}
{
"message" => "<2016-07-07 00:32:22> Export2CICAP (04) => Export CO : 87 record(s)\r?",
"@version" => "1",
"@timestamp" => "2016-07-06T16:32:22.000Z",
"path" => "C:/CIGNA/Export.log",
"host" => "SIMSPad",
"type" => "txt",
"Timestamp" => "2016-07-07 00:32:22",
"Status" => "Export2CICAP"
}
从输出中可以看出,第一条输出消息存在 grok 解析错误,其他 2 个结果未完全解析消息。我应该如何修改我的 grok 语句以便它可以完全解析消息?
对于第一条消息,问题出在没有出现在模式中的两个 ??
,因此创建了 _grokparsefailure
.
第二条和第三条消息未完全解析,因为前两个模式与消息不匹配,因此消息由最后一个模式解析。
对于第二条消息,如果你想用第一个模式(<%{TIMESTAMP_ISO8601:Timestamp}> (%{WORD:Level} - )%{NOTSPACE:Job_Code} => %{GREEDYDATA:message}
)解析它,你的模式是错误的:
()
%{WORD:Level} -
左右没有出现在日志中。:Timestamp}>
和%{WORD:Level}
之间少了一个space。在日志中有两个,模式中只有一个。请注意,您可以使用%{SPACE}
来避免此问题(因为%{SPACE}
将匹配任意数量的 space)%{NOTSPACE:Job_Code}
匹配一个没有space的字符序列,但是Export_Sysem 6 (1)
中有一个space,所以Job_Code
会是Export_Sysem
和模式中的=>
将阻止与第一个模式的成功匹配。
正确的模式:
<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Level} - %{DATA:Job_Code} => %{GREEDYDATA:message}
对于第三条消息,我看不出应该使用哪种模式。
如果您添加更多详细信息,我会更新我的答案。