如何编写适配多格式Nginx错误日志的单个Grok过滤规则
解决方案
可以通过Grok的可选分组语法调整现有规则,实现单个模式同时匹配包含/缺失upstream、referrer字段的Nginx错误日志。
修改后的完整Grok规则
(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:message}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: "%{GREEDYDATA:request}"(?:, upstream: "%{URI:upstream}")?, host: "%{IPORHOST:host}"(?:, referrer: "(?:%{URI:referrer})")?
规则说明
- Grok中
(?:内容)?表示可选非捕获分组:分组内的整段内容存在时就匹配提取字段,不存在时直接跳过该段,不会触发整体匹配失败 - 两个可选分组相互独立,可覆盖3种场景:同时存在两个字段、仅存在其中一个字段、两个字段都不存在
- 如果部分日志的
upstream/referrer值不是标准URI格式,可把对应位置的%{URI}替换为%{DATA}适配异常值场景
内容的提问来源于stack exchange,提问作者tustus
相关产品推荐
相关产品推荐

