Getting logstash log parse error: grokparsefailure
Getting logstash log parse error: grokparsefailure
我尝试将 logstash 集成到我们的应用程序中,我在自定义模式文件中包含以下模式。
Path: <path>/custom_pattern -- This is custom pattern file. I include this path in conf.
Content: ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp})
我的 logstash 配置文件:
input {
file{
path => "/tmp/jboss-logs.log"
start_position => beginning
}
}
filter {
if [path] =~ "jboss" {
mutate { replace => { "type" => "jboss_access"}}
grok {
patterns_dir => "<dir path>"
match => { "message" => "%{ACCESSLOGPARSE}" }
}
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
我的jboss-logs.log文件内容:
[09/Jan/2015:00:00:02 +0000] 127.0.0.1 xff=-
[09/Jan/2015:00:10:17 +0000] 100.20.10.11 xff=100.40.11.3
当我执行 logstash 时,我得到了以下未解析日志的输出。
{
"message" => "[09/Jan/2015:00:00:02 +0000] 127.0.0.1 xff=-",
"@version" => "1",
"@timestamp" => "2015-01-20T15:30:10.865Z",
"host" => "Salvador",
"path" => "/tmp/jboss-logs.log",
"type" => "jboss_access",
"tags" => [
[0] "_grokparsefailure"
]
}
{
"message" => "[09/Jan/2015:00:10:17 +0000] 100.20.10.11 xff=100.40.11.3",
"@version" => "1",
"@timestamp" => "2015-01-20T15:30:10.869Z",
"host" => "Salvador",
"path" => "/tmp/jboss-logs.log",
"type" => "jboss_access",
"tags" => [
[0] "_grokparsefailure"
]
}
问题是日志中的 'xff' 键可能包含 ip 或“-”。
我也尝试过以下模式。但是他们也没有用。
ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp}|-)
and
ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp}|xff=-)
此模式的解析器有什么问题?
您的第一个模式仅使用 IPORHOST,不支持将“-”作为有效值。
您的第二个模式 (?: xff=%{IPORHOST:xffIp}|-) 正在寻找 "xff=1.2.3.4" 或“-”。您输入的是 "xff=-",不匹配。
另请注意,“(?:”后的 space 很重要,应将其删除。
这些工作:
xff=(?:%{IPORHOST:xffIp}|-)
(但当值为“-”时xffIp将为NULL)
使用更通用的模式:
(?:xff=%{NOTSPACE:xffIp})
或者您可以定义一个新模式:
IPORHOSTORDASH (?:%{IPORHOST}|-)
并使用它:
(?:xff=%{IPORHOSTORDASH:xffIp})
将解析后的值放入xffIP字段。
如果您的行中有更多 key/value 字段,您应该查看 kv{} 过滤器。
我尝试将 logstash 集成到我们的应用程序中,我在自定义模式文件中包含以下模式。
Path: <path>/custom_pattern -- This is custom pattern file. I include this path in conf.
Content: ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp})
我的 logstash 配置文件:
input {
file{
path => "/tmp/jboss-logs.log"
start_position => beginning
}
}
filter {
if [path] =~ "jboss" {
mutate { replace => { "type" => "jboss_access"}}
grok {
patterns_dir => "<dir path>"
match => { "message" => "%{ACCESSLOGPARSE}" }
}
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch { host => localhost }
stdout { codec => rubydebug }
}
我的jboss-logs.log文件内容:
[09/Jan/2015:00:00:02 +0000] 127.0.0.1 xff=-
[09/Jan/2015:00:10:17 +0000] 100.20.10.11 xff=100.40.11.3
当我执行 logstash 时,我得到了以下未解析日志的输出。
{
"message" => "[09/Jan/2015:00:00:02 +0000] 127.0.0.1 xff=-",
"@version" => "1",
"@timestamp" => "2015-01-20T15:30:10.865Z",
"host" => "Salvador",
"path" => "/tmp/jboss-logs.log",
"type" => "jboss_access",
"tags" => [
[0] "_grokparsefailure"
]
}
{
"message" => "[09/Jan/2015:00:10:17 +0000] 100.20.10.11 xff=100.40.11.3",
"@version" => "1",
"@timestamp" => "2015-01-20T15:30:10.869Z",
"host" => "Salvador",
"path" => "/tmp/jboss-logs.log",
"type" => "jboss_access",
"tags" => [
[0] "_grokparsefailure"
]
}
问题是日志中的 'xff' 键可能包含 ip 或“-”。 我也尝试过以下模式。但是他们也没有用。
ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp}|-)
and
ACCESSLOGPARSE \[%{HTTPDATE:timestamp}\] %{IPORHOST:clientip} (?: xff=%{IPORHOST:xffIp}|xff=-)
此模式的解析器有什么问题?
您的第一个模式仅使用 IPORHOST,不支持将“-”作为有效值。
您的第二个模式 (?: xff=%{IPORHOST:xffIp}|-) 正在寻找 "xff=1.2.3.4" 或“-”。您输入的是 "xff=-",不匹配。
另请注意,“(?:”后的 space 很重要,应将其删除。
这些工作:
xff=(?:%{IPORHOST:xffIp}|-)
(但当值为“-”时xffIp将为NULL)
使用更通用的模式:
(?:xff=%{NOTSPACE:xffIp})
或者您可以定义一个新模式:
IPORHOSTORDASH (?:%{IPORHOST}|-)
并使用它:
(?:xff=%{IPORHOSTORDASH:xffIp})
将解析后的值放入xffIP字段。
如果您的行中有更多 key/value 字段,您应该查看 kv{} 过滤器。