You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Logstash标准化JSON日志URL:动态部分替换与字段提取

刚好之前做过类似的Logstash URL标准化和参数提取需求,我来给你一步步拆解配置方案!

整体思路

我们需要分三步实现你的需求:

  1. 从原始URL中提取查询参数,单独存为临时字段
  2. 把提取到的查询参数解析为键值对字段,存入Elasticsearch
  3. 对原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:51:53