条件匹配与 grok for logstash
conditional matching with grok for logstash
我有php这种格式的日志
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some php error type>: <other msg with /path/of/a/php/script/file.php and something else>
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some php error type>: <other msg without any file name in it>
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some msg with out semicolon in it but /path/of/a/file inside the message>
这是我试图在通过 logstash 处理后发送到 Graylog2。使用 this post here,我能够开始。现在我想要一些额外的字段,所以我的最终版本看起来像这样。
{
"message" => "<The entire error message goes here>",
"@version" => "1",
"@timestamp" => "converted timestamp from Day Mon DD HH:MM:SS YYYY",
"host" => "<ipv4 ip address>",
"logtime" => "Day Mon DD HH:MM:SS YYYY",
"loglevel" => "Log-Type",
"clientip" => "<ipv4 ip address>",
"php_error_type" => "<some php error type>"
"file_name_from_the_log" => "/path/of/a/file || /path/of/a/php/script/file.php"
"errormsg" => "<the error message after first colon (:) found>"
}
我有单独行的表达式,或者至少我认为这些应该能够解析,使用 grokdebugger。像这样:
%{DATA:php_error_type}: %{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}
%{DATA:php_error_type}: %{GREEDYDATA:errormsg}
%{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}
但我发现很难让它对整个日志文件起作用。
有什么建议吗?此外,不确定日志文件中是否会有任何其他类型的错误消息。但目的是为所有人获得相同的格式。关于如何处理这些日志以获得上述格式的任何建议?
grok filter可以配置多种模式:
grok {
match => [
"message", "%{DATA:php_error_type}: %{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}",
"message", "%{DATA:php_error_type}: %{GREEDYDATA:errormsg}",
"message", "%{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}"
]
}
(您可以使用多个 grok 过滤器而不是具有多个模式的单个过滤器,但是您可能希望使用 tag_on_failure => []
禁用 _grokparsefailure 标记。)
如果您有时缺少日志行的某些部分,您可以使用以下语法:
(?:%{PATTERN1}|%{PATTERN2})
或
(?:%{PATTERN1}|)
允许PATTERN1 OR ''
。 (空)
使用它,您可以只管理一个模式:
grok {
match => [
"message", "(?:%{DATA:php_error_type}: |)(?:%{DATA:message_part1}:)(?:%{URIPATHPARAM:file_name}|)%{GREEDYDATA:errormsg}",
]
}
如果您遇到问题,可以将 %{DATA}
替换为更严格的模式。
您也可以使用此语法(更像正则表达式)
(?:%{PATTERN1})?
要调试复杂的 grok 模式,我建议:
- https://grokconstructor.appspot.com/do/match(多行选项+同时输入多行+其他选项)
- https://grokdebug.herokuapp.com/(使用更简单)
我有php这种格式的日志
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some php error type>: <other msg with /path/of/a/php/script/file.php and something else>
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some php error type>: <other msg without any file name in it>
[Day Mon DD HH:MM:SS YYYY] [Log-Type] [client <ipv4 ip address>] <some msg with out semicolon in it but /path/of/a/file inside the message>
这是我试图在通过 logstash 处理后发送到 Graylog2。使用 this post here,我能够开始。现在我想要一些额外的字段,所以我的最终版本看起来像这样。
{
"message" => "<The entire error message goes here>",
"@version" => "1",
"@timestamp" => "converted timestamp from Day Mon DD HH:MM:SS YYYY",
"host" => "<ipv4 ip address>",
"logtime" => "Day Mon DD HH:MM:SS YYYY",
"loglevel" => "Log-Type",
"clientip" => "<ipv4 ip address>",
"php_error_type" => "<some php error type>"
"file_name_from_the_log" => "/path/of/a/file || /path/of/a/php/script/file.php"
"errormsg" => "<the error message after first colon (:) found>"
}
我有单独行的表达式,或者至少我认为这些应该能够解析,使用 grokdebugger。像这样:
%{DATA:php_error_type}: %{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}
%{DATA:php_error_type}: %{GREEDYDATA:errormsg}
%{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}
但我发现很难让它对整个日志文件起作用。
有什么建议吗?此外,不确定日志文件中是否会有任何其他类型的错误消息。但目的是为所有人获得相同的格式。关于如何处理这些日志以获得上述格式的任何建议?
grok filter可以配置多种模式:
grok {
match => [
"message", "%{DATA:php_error_type}: %{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}",
"message", "%{DATA:php_error_type}: %{GREEDYDATA:errormsg}",
"message", "%{DATA:message_part1}%{URIPATHPARAM:file_name}%{GREEDYDATA:errormsg}"
]
}
(您可以使用多个 grok 过滤器而不是具有多个模式的单个过滤器,但是您可能希望使用 tag_on_failure => []
禁用 _grokparsefailure 标记。)
如果您有时缺少日志行的某些部分,您可以使用以下语法:
(?:%{PATTERN1}|%{PATTERN2})
或
(?:%{PATTERN1}|)
允许PATTERN1 OR ''
。 (空)
使用它,您可以只管理一个模式:
grok {
match => [
"message", "(?:%{DATA:php_error_type}: |)(?:%{DATA:message_part1}:)(?:%{URIPATHPARAM:file_name}|)%{GREEDYDATA:errormsg}",
]
}
如果您遇到问题,可以将 %{DATA}
替换为更严格的模式。
您也可以使用此语法(更像正则表达式)
(?:%{PATTERN1})?
要调试复杂的 grok 模式,我建议:
- https://grokconstructor.appspot.com/do/match(多行选项+同时输入多行+其他选项)
- https://grokdebug.herokuapp.com/(使用更简单)