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

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"  

解决方案

问题根源

  1. 原正则[a-z]+-[a-z]+只能匹配纯小写字母+单个连字符的结构,无法覆盖Pod名称里的数字和后续连字符
  2. 未指定捕获组索引: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 02:53:11