我有麻烦得到以下nginx错误日志消息parsing在grokdebugging器 。 我有一种感觉,我应该使用一个愚蠢的伎俩,但不知道它可能是什么。
2015/03/20 23:35:52 [error] 8#0:* 10241823在logging请求时,客户端:201.45.203.78服务器:$ domain,testing“/ www”存在失败(2:没有这样的文件或目录)请求:“GET / ritikapuri_”
到目前为止,这是我的Grok模式:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage} client: %{IP:client}
这种模式让我到“服务器”部分,但我似乎无法得到其余的parsing,并不清楚为什么。
如果我使用另一个%{GREEDYDATA}模式抓取日志的结尾,它有时不会parsing与上面不匹配的日志,并给我一个_grokparsefailure。
最好的路线是使用if语句来捕获nginx中日志消息的不同变体吗?
我已经遵循包括这个方法,但不能让他们的工作。
没有看到你尝试的模式不起作用,我不能评论他们为什么不工作。 正如你所说的你提供的模式与服务器相匹配,我已经稍微修改了你的语句,并添加了一些到最后来捕获其余的:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage},\ client: %{IP:client}, server: \$domain, request: \"%{WORD:method} %{URIPATH:path}\"
请注意,在您的GREEDYDATA之后,我添加了一个逗号,因为您可能不想在捕获的数据中使用这个逗号,并且我假设它始终在邮件的客户端部分之前使用。 我怀疑你有问题匹配$域,因为你需要在$前面的\来逃避它。
请注意,虽然这在grokdebugging器中工作,但我怀疑它不会在logstash中,所以还需要将所有空间都转义出来,以便logstash能够很好地处理这种模式(即,将每个实例更改为“ “ 至 ”\ ”)
回覆。 :最好的路线是使用if语句来捕获nginx中日志消息的不同变体吗?
我不完全清楚你要问什么,但是你可以把你的filter或者filter的一部分放在if语句中,就像在这个答案中一样 。 如果你能想出一个方法来标记它们,你可以使用标签来做同样的事情。 这两个选项对于每一行的处理能力来说可能是“最好的”,因为我相信这样的工作涉及的工作量比这个要less,因为每个事件都需要根据每个模式进行检查。 你也可以写出一个非常复杂的模式来匹配每一个不同的情况,但是我不认为这是一个理想的模式,因为模式会扩展到有很多不同的潜在匹配,所以每次都需要很大的权力去检查。
我希望有帮助!
这个grok配方也可以工作,不pipeserver字段的值如何:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:errormessage}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: %{GREEDYDATA:request}