RSYSLOG正则表达式无论使用何种表达式均匹配失败求助
问题:rsyslog正则无法提取Pod名称前缀作为日志文件名
日志示例
May 19 08:52:14 - ansible-exploitation-6cbcf9cb87ty-j8cqw - local0.info - ansible message bla bla bla
需求
- 从日志里的Pod名称
ansible-exploitation-6cbcf9cb87ty-j8cqw中提取ansible-exploitation作为日志文件名前缀 - 运行环境为Kubernetes集群,必须使用当前rsyslog方案实现,不考虑其他K8s日志采集方案
已尝试操作
- 用rsyslog官方正则测试工具调试表达式,始终匹配失败
- 最后尝试
".+"表达式,仍显示NO MATCH
rsyslog信息
Version: 8.2512.0 aka 2025.12 PLATFORM: x86_64-alpine-linux FEATURE_REGEXP: Yes
当前使用的rsyslog模板
definition: (successfuly tested on rsyslog.com/regex) template(name="SimpleFormat" type="string" string="%timegenerated% - %hostname:R,ERE,0,DFLT:\"[a-z]+-[a-z]+\"--end% - %pri-text% - %syslogtag% - %msg%\n") $ActionFileDefaultTemplate SimpleFormat $template dkct-rsyslog,"/var/preprod/logs/dkct-rsyslog-%HOSTNAME:R,ERE,0,DFLT:\"[a-z]+-[a-z]+\"--end%.log"
解决方案
问题根源
- 原正则
[a-z]+-[a-z]+只能匹配纯小写字母+单个连字符的结构,无法覆盖Pod名称里的数字和后续连字符 - 未指定捕获组索引:rsyslog中用
R,ERE模式时,需要指定捕获组编号(从1开始)才能提取对应内容,原模板用的0表示匹配整个表达式,而非提取分组
修正后的模板
把模板里的正则替换为^([a-z]+-[a-z]+)-,并将捕获组索引从0改为1,完整代码如下:
template(name="SimpleFormat" type="string" string="%timegenerated% - %hostname:R,ERE,1,DFLT:\"^([a-z]+-[a-z]+)-\"--end% - %pri-text% - %syslogtag% - %msg%\n") $ActionFileDefaultTemplate SimpleFormat $template dkct-rsyslog,"/var/preprod/logs/dkct-rsyslog-%HOSTNAME:R,ERE,1,DFLT:\"^([a-z]+-[a-z]+)-\"--end%.log"
正则说明
^:锚定字符串开头,避免匹配中间的类似结构([a-z]+-[a-z]+):捕获第一个连字符前后的小写字母部分,也就是目标前缀ansible-exploitation-:匹配前缀后的连字符,确保只提取到前缀为止
验证方式
直接用rsyslog测试工具,输入Pod名称ansible-exploitation-6cbcf9cb87ty-j8cqw,测试^([a-z]+-[a-z]+)-,确认能正确捕获目标前缀。
内容的提问来源于stack exchange,提问作者Matthieu Feron
相关产品推荐
相关产品推荐

