创建Grok模式时如何处理贪婪数据并提取日志自定义词(含Sub-feature name)
Grok模式创建中的贪婪数据处理及特殊字段匹配方案
日志示例
01-10-2022 14:05:11.584 INFO - Destination IP:0:0:0:0:0:0:0:1 | Source System IP:0:0:0:0:0:0:0:1 | BrowserName:Chrome | BrowserVersion:105 | requestURI:/dashboard | Feature name:Dashboard | Application:null | SubFeature name:Line Check | UserId:tushar | ApiCalled:/ruambot/api/getGraph() | ApiStatus:Success | Login Time:01-10-2022 13:46:42
1. 贪婪数据的处理方案
Grok默认的.*是贪婪匹配规则,会尽可能匹配更多内容,极易出现跨字段提取错误。针对这类以|作为字段分隔符的日志,可通过两种方式解决:
- 非贪婪匹配替代:用
.*?替换.*,它会匹配到第一个分隔符就停止,避免过度匹配。 - 字符集范围限定:用
[^|]+匹配任意非|的字符,直接限定匹配范围不跨过分隔符,这种方式性能比非贪婪匹配更优。
2. 带空格字段(如SubFeature name)的匹配方案
字段名包含空格时,只需在Grok模式中完整写出带空格的字段名,再搭配对应的匹配规则即可。注意字段名的空格要和日志中的完全一致,不能省略或替换。
完整Grok模式示例
%{DATE_US:log_date} %{TIME:log_time} %{LOGLEVEL:loglevel} - Destination IP:%{DATA:destination_ip} \| Source System IP:%{DATA:source_system_ip} \| BrowserName:%{DATA:browser_name} \| BrowserVersion:%{DATA:browser_version} \| requestURI:%{DATA:request_uri} \| Feature name:%{DATA:feature_name} \| Application:%{DATA:application} \| SubFeature name:%{DATA:subfeature_name} \| UserId:%{DATA:user_id} \| ApiCalled:%{DATA:api_called} \| ApiStatus:%{DATA:api_status} \| Login Time:%{DATE_US:login_date} %{TIME:login_time}
说明:
- 用
%{DATA:字段名}匹配字段值,DATA模式本身是.*?非贪婪匹配,结合转义后的分隔符\|,刚好适配日志格式。 - 所有带空格的字段名(如
Destination IP、SubFeature name)都完整写入模式中,确保精准匹配。
内容的提问来源于stack exchange,提问作者saiprasan palo
相关产品推荐
相关产品推荐

