Logstash标准化JSON日志URL:动态部分替换与字段提取
刚好之前做过类似的Logstash URL标准化和参数提取需求,我来给你一步步拆解配置方案!
整体思路
我们需要分三步实现你的需求:
- 从原始URL中提取查询参数,单独存为临时字段
- 把提取到的查询参数解析为键值对字段,存入Elasticsearch
- 对原始URL进行正则替换,把动态路径段和查询参数替换为指定占位符
完整Logstash过滤器配置
filter { # 1. 提取查询参数到临时字段 mutate { add_field => { "query_params_raw" => "%{[httpRequest][requestUrl]}" } gsub => [ "query_params_raw", "^[^?]+\\?", "", # 移除URL路径部分,仅保留?后的查询参数 "query_params_raw", "^[^?]+$", "" # 处理无查询参数的情况,设为空字符串 ] } # 2. 解析查询参数为Elasticsearch可索引的键值对字段 kv { source => "query_params_raw" target => "httpRequest.queryParams" # 参数将存入这个嵌套字段,方便分类管理 field_split => "&" value_split => "=" remove_field => "query_params_raw" # 临时字段用完即可删除 } # 3. 标准化requestUrl,替换动态部分为占位符 mutate { gsub => [ # 替换第一个动态路径段(比如你的someTenant)为{{someTenant}} "[httpRequest][requestUrl]", "^/[^/]+", "/{{someTenant}}", # 替换查询参数部分为{{someParams}} "[httpRequest][requestUrl]", "\\?.*$", "?{{someParams}}", # 处理无查询参数的URL,避免末尾多余的? "[httpRequest][requestUrl]", "\\?$", "" ] } }
配置细节解释
- 提取查询参数:通过
mutate的gsub操作,先把原始URL复制到临时字段query_params_raw,再移除路径部分,只留下?后面的参数内容。如果URL没有查询参数,就把临时字段设为空。 - 解析参数为键值对:用Logstash内置的
kv过滤器,把临时字段里的参数字符串(比如proj=56&user=123)解析成嵌套字段httpRequest.queryParams,最终在ES里会呈现为{"httpRequest": {"queryParams": {"proj": "56", "user": "123"}}}。 - URL标准化:两次
gsub操作分别处理动态路径和查询参数:- 第一个正则
^/[^/]+匹配URL开头的第一个路径段(比如/someTenant),替换为/{{someTenant}}; - 第二个正则
\\?.*$匹配?及后面的所有内容,替换为?{{someParams}}; - 最后一步处理无参数的情况,避免URL末尾出现多余的
?。
- 第一个正则
如果你的动态路径段不是第一个路径(比如/foo/someTenant/submit),只需要调整第一个gsub的正则即可,比如改成"/foo/[^/]+"替换为"/foo/{{someTenant}}"。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

