Logstash基于url字段生成新字段:webpage_category提取失败求助
解决Logstash中webpage_category字段无法生成的问题
我来帮你排查下这个问题,核心是你的Grok模式定义、匹配语法都有错误,而且条件判断没覆盖所有非JOB类型的URL场景,一步步来修正:
1. 修正自定义Grok模式文件
你现在写的webpage_category .* job_type .*完全不符合Grok模式的规范——每个模式需要单独定义,格式是「模式名称 对应的正则表达式」。把/etc/logstash/patterns文件改成:
webpage_category [a-zA-Z0-9_]+ job_type [a-zA-Z0-9 -]+
webpage_category用来匹配.do前面的文件名部分(比如incident、navpage_form_default),正则[a-zA-Z0-9_]+可以覆盖字母、数字、下划线的常见场景;job_type用来匹配JOB后面的描述,因为包含空格和连字符,所以用[a-zA-Z0-9 -]+来兼容。
2. 修正Filter块的Grok配置
你之前的else if条件只匹配了带?参数的.do链接,而且Grok匹配的写法错误(用了/{webpage_category:webpage_category},正确的应该是%{模式名称:字段名}),同时要把不带参数的.do链接也纳入处理。修改后的配置如下:
filter { if [url] =~ /^JOB: .*/ { grok { patterns_dir => ["/etc/logstash/patterns"] match => { "url" => "JOB: %{job_type:job_type}" } } } else if [url] =~ /^\/.*\.do/ { # 去掉末尾的?,覆盖带参数和不带参数的.do链接 grok { patterns_dir => ["/etc/logstash/patterns"] # 匹配/xxx.do或者/xxx.do?xxx的格式,提取.do前面的部分 match => { "url" => "/%{webpage_category:webpage_category}\.do\??.*" } } } }
关键修正点:
- 把
else if的正则改成/^\/.*\.do/,这样不管有没有?参数的.do链接都会被匹配到; - Grok匹配表达式改用
%{webpage_category:webpage_category},这是调用自定义模式并映射到字段的正确写法; - 在
.do后面加了\??,表示问号是可选的,同时兼容带参数和不带参数的URL格式。
3. 验证配置有效性
可以用Logstash的测试命令验证配置是否正确:
logstash --config.test_and_exit -f /你的配置文件路径.conf
也可以用Grok调试工具单独测试匹配规则:
- 对于
/incident.do?sys_id=0dc18b246faa17007a64cbe64f3ee4e1&sysparm_view,会提取出webpage_category: incident; - 对于
/navpage_form_default.do,会提取出webpage_category: navpage_form_default; - JOB开头的URL依然能正常生成
job_type字段。
内容的提问来源于stack exchange,提问作者Michael Dz
相关产品推荐
相关产品推荐

