我有一個 nginx 錯誤日志的 grok 模式:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:text}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: \"(?:%{WORD:requesttype} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion}))\"(, upstream: "%{GREEDYDATA:upstream}\")?, host: "%{DATA:host}\"(, referrer: \"%{GREEDYDATA:referrer}\")?
我有這種錯誤
2022/01/17 08:23:39 [error] 8#8: *0000016 this is my error message, client: 1.2.3.4, server: my.server.name, request: "GET /my/url/ HTTP/1.1", upstream: "http://upstream.server.name", host: "my.server.name", referrer: "https://referrer.server.name/"
2022/01/17 12:30:41 [error] 8#8: *0000016 access forbidden by rule, client: 1.2.3.4, server: my.server.name, request: "GET / HTTP/2.0", host: "my.server.name"
2022/01/17 08:23:39 [error] 8#8: *0000016 could not be resolved
為了進行測驗,我在 apppot 中使用了 grokconstructor,并且我的 grok 模式在前兩行中效果很好,但我不能讓它適用于最后一行:

什么模式適用于所有三行?
uj5u.com熱心網友回復:
這會起作用:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{DATA:text}(, client: %{IP:client}, server: %{GREEDYDATA:server}, request: \"(?:%{WORD:requesttype} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion}))\"(, upstream: "%{GREEDYDATA:upstream}\")?, host: "%{DATA:host}\"(, referrer: \"%{GREEDYDATA:referrer}\")?)?$.
最后一部分是可選的()?。
請注意,對于前兩行末尾的鍵值對,您應該使用kv插件而不是在 grok 中使用它。因此,使用 grok 過濾器將該部分存盤在一個臨時欄位中,如下所示:
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{DATA:text}(, %{GREEDYDATA:kv_value})?$
然后在 kv_value 上使用 kv 過濾器:
kv {
field_split => " ,"
value_spliy => ": "
trim_value => "\""
source => "kv_value"
}
在這兩種情況下,不要忘記$grok 模式末尾的 ,因為沒有它將無法正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/415426.html
標籤:
下一篇:如何正確配置Nginx反向代理?
