如何通过Logstash基于Mobile_Number字段新增国家名称字段
方案实现(基于Logstash原生过滤器,无需引入第三方依赖)
核心逻辑是先匹配手机号前缀提取国家码,再做字典映射,支持后续快速扩展国家码规则。
filter{ # 原有grok提取基础字段的逻辑保持不变 grok { break_on_match => false match => { "message" => [ "Mobile_Number: (?<Mobile_Number>[0-9]+)", "User_id(?<User_id>[0-9]+)" ] } } # 新增:匹配手机号前缀提取国家码,国家码规则按位数从长到短排列避免误匹配 grok { match => { "Mobile_Number" => [ # 3位国家码放最前面 "^(?<country_code>971)[0-9]+", # 2位国家码 "^(?<country_code>20)[0-9]+" # 后续新增国家码直接按位数降序加在这里即可,比如加中国86就加一行 "^(?<country_code>86)[0-9]+" ] } tag_on_failure => ["_no_country_code_match"] # 匹配不到国家码的日志会打这个标签方便后续排查 } # 新增:国家码映射国家名称 translate { field => "country_code" target => "country" dictionary => { "971" => "巴林" "20" => "埃及" # 后续新增国家映射直接往这个字典里加键值对即可 } fallback => "未知国家" # 匹配不到映射的默认值 } # 可选:不需要保留中间生成的country_code字段可以开启下面的配置 # mutate { # remove_field => ["country_code"] # } }
效果验证
- 手机号为
201123123123的日志:自动提取country_code=20,最终生成country=埃及 - 手机号为
971123123123的日志:自动提取country_code=971,最终生成country=巴林
扩展说明
后续新增国家码只需要两步操作:
- 在第二个grok的match规则里,按国家码位数从长到短新增对应前缀匹配规则
- 在translate的dictionary里新增国家码和国家名的键值对即可
如果国家码规则较多,也可以把映射字典单独存为yaml文件,避免logstash配置过长,只需将translate配置里的dictionary替换为dictionary_path => "/path/to/country_map.yaml",yaml文件内容格式为:
"20": "埃及" "971": "巴林" "86": "中国"
内容的提问来源于stack exchange,提问作者Divyank
相关产品推荐
相关产品推荐

