如何用Grok从URI路径过滤9位用户ID及可选URIPARAM?
调整Grok模式提取HTTP日志中的9位用户ID并保留完整URI及可选参数
需求说明
从HTTP访问日志的URI中提取9位用户ID,同时保留完整URI及可选的URIPARAM参数。
日志示例
"123.123.123.234" "yRETHGsggbbkndgddggddgRR" "03/Aug/2022:13:59:58 +0200" "34" "GET /api/v1/users/323408611/action/check-status HTTP/1.1" 200 26 "Apache-HttpClient/4.5.9 (Java)"
现有Grok模式
"%{IP:ip}" "%{DATA:rdmgen}" "%{HTTPDATE:timestamp}" "%{NUMBER:time}" "%{WORD:urimthd} %{PATH:path}(?:%{URIPARAM:param})? %{WORD:proto}/%{NUMBER:proto_ver}" %{NUMBER:status} %{NUMBER:total} "%{GREEDYDATA:agent}"
调整后的Grok模式
针对日志中/users/后紧跟9位用户ID的结构,修改路径匹配逻辑,同时保留完整URI和可选参数:
"%{IP:ip}" "%{DATA:rdmgen}" "%{HTTPDATE:timestamp}" "%{NUMBER:time}" "%{WORD:urimthd} (?<full_uri>.*\/users\/%{NUMBER:user_id:9}\/.*)(?:%{URIPARAM:param})? %{WORD:proto}/%{NUMBER:proto_ver}" %{NUMBER:status} %{NUMBER:total} "%{GREEDYDATA:agent}"
调整说明
- 替换原
%{PATH:path}为自定义正则捕获组(?<full_uri>.*\/users\/%{NUMBER:user_id:9}\/.*):full_uri字段保留完整的URI路径部分,满足保留完整URI的需求%{NUMBER:user_id:9}精准捕获/users/后的9位数字作为用户ID,确保匹配长度符合要求
- 保留原有的
(?:%{URIPARAM:param})?可选匹配逻辑,兼容日志中URIPARAM存在或缺失的场景
如果你的URI前缀固定为/api/v1/users/,可以使用更精准的版本避免误匹配:
"%{IP:ip}" "%{DATA:rdmgen}" "%{HTTPDATE:timestamp}" "%{NUMBER:time}" "%{WORD:urimthd} (?<full_uri>/api/v1/users/%{NUMBER:user_id:9}/.*)(?:%{URIPARAM:param})? %{WORD:proto}/%{NUMBER:proto_ver}" %{NUMBER:status} %{NUMBER:total} "%{GREEDYDATA:agent}"
内容的提问来源于stack exchange,提问作者tygerpuli
相关产品推荐
相关产品推荐

