jmr*_*cha 7 nginx logging regex logstash grok
我无法在grok 调试器中解析以下 nginx 错误日志消息。我有一种感觉,我应该使用一个愚蠢的技巧,但无法弄清楚它可能是什么。
2015/03/20 23:35:52 [错误] 8#0: *10241823 在记录请求时测试“/www”存在失败(2:没有这样的文件或目录),客户端:201.45.203.78,服务器:$domain,请求:“GET /ritikapuri_”
到目前为止,这是我的 Grok 模式:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER}: %{GREEDYDATA:errormessage} client: %{IP:client}
Run Code Online (Sandbox Code Playgroud)
这种模式让我进入“服务器”部分,但我似乎无法解析其余部分,我不清楚为什么。
如果我使用另一个 %{GREEDYDATA} 模式来获取日志的末尾,它有时不会解析与上述不匹配的日志并给我一个 _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}\"
Run Code Online (Sandbox Code Playgroud)
请注意,在您的 GREEDYDATA 之后,我添加了一个逗号,因为您可能不希望在捕获的数据中使用它,并且我假设它将始终在消息的客户端部分之前使用。我怀疑您在匹配 $domain 时遇到问题,因为您需要在 $ 前面有一个 \ 来转义它。
请注意,虽然这在 grok 调试器中有效,但我怀疑它在 Logstash 中不起作用,您还需要转义所有空格,以便 Logstash 能够很好地处理该模式(即更改每个实例” “ 到 ”\ ”)
关于。:最好的方法是使用 if 语句来捕获 nginx 中日志消息的不同变体?
我不太清楚你在问什么,但你可以在你的过滤器或过滤器的一部分周围放置 if 语句,就像在这个答案中一样。如果您能找到标记标签的方法,您可以使用标签做同样的事情。就每条线使用的处理能力而言,这两个选项可能是“最好的”,因为我相信涉及的工作比这个答案要少,因为每个事件都需要根据每个模式进行检查。您还可以编写一个非常复杂的模式,可以匹配每种不同的情况,但我认为这并不理想,因为该模式会扩展为具有如此多不同的潜在匹配,因此每次检查都需要花费大量的精力。
我希望这有帮助!