如何移除Grok模式匹配中program1字段的方括号及内部数字
统一提取程序名的Grok模式调整方案
最终可用的Grok模式
<%{NUMBER:syslogpri}>%{SYSLOGTIMESTAMP:timestamp} %{NOTSPACE:syslog_device_hostname} %{WORD:program1}(?:\[%{NUMBER:program_number}\])?:%{GREEDYDATA:message}
调整逻辑说明
原模式中%{NOTSPACE:program1}会把sudo[4077568]整个当作程序名,这是因为NOTSPACE会匹配所有非空白字符,包括括号和进程号。调整后:
%{WORD:program1}:仅匹配字母数字组成的程序名(比如sudo),直接提取核心程序名称,排除后续的进程号后缀。(?:\[%{NUMBER:program_number}\])?:这就是你疑惑的非捕获组用法:(?:...):表示这个组仅用于匹配逻辑,不会生成额外的无名捕获字段(如果去掉?:,会多一个无意义的捕获项);- 内部的
%{NUMBER:program_number}是命名捕获,专门提取进程号; - 末尾的
?标记这个组为可选,确保没有进程号的日志(比如第一条)也能正常匹配。
匹配结果验证
第一条日志匹配
<85>May 8 11:26:40 test123 sudo: LCOpsMGRSCX : (command blablalblablalblalba) asdasldma
提取字段:
syslogpri:85timestamp:May 8 11:26:40syslog_device_hostname:test123program1:sudomessage:LCOpsMGRSCX : (command blablalblablalblalba) asdasldma
(无进程号,program_number字段不会生成)
第二条日志匹配
<85>May 7 20:52:15 test123 sudo[4077568]: program : TTY=pts/0 ;
提取字段:
syslogpri:85timestamp:May 7 20:52:15syslog_device_hostname:test123program1:sudoprogram_number:4077568message:program : TTY=pts/0 ;
非捕获组核心作用总结
非捕获组(?:...)主要用来组织匹配规则,同时避免生成冗余的无名捕获字段。它和普通捕获组(...)的区别是:普通组会额外生成一个无名的捕获结果(比如正则中的$1),而非捕获组只执行匹配逻辑,不产生额外输出,让你的字段提取更干净。
内容的提问来源于stack exchange,提问作者h0llym0lly
相关产品推荐
相关产品推荐

