Ansible使用regex_findall提取含特殊字符的多行日志匹配失败求解
Ansible 多行重音日志连续行提取方案
核心问题根源
- 你之前将
stdout_lines转为字符串的操作会破坏原始日志的换行结构,生成带列表格式符的异常文本,导致正则匹配失效 - Jinja2模板会提前解析正则中的
\u开头的Unicode转义字符,导致正则规则被错误识别 - multiline模式下
$的行尾匹配存在边界歧义,不如直接匹配\n更精准
可直接使用的修改后任务代码
- name: 提取错误与异常行对 debug: msg: "错误行:{{ item[0] }},异常行:{{ item[1] }}" loop: "{{ test_result.stdout | regex_findall('(Error validating properties for broker :.*?)\\n(.*?Exception:.*?)\\n') }}"
注意正则里的
\n需要转义为\\n,是因为Jinja2字符串解析的转义要求
关键优化点说明
- 直接使用
test_result.stdout:该变量保留了命令输出的原始多行文本,换行、特殊字符、重音字符都完全和原始日志一致,避免了stdout_lines转字符串带来的格式污染 - 正则规则优化:
- 用
.*?非贪婪匹配每行内容,Python的re模块默认.不匹配换行,因此会自动在当前行结尾停止,兼容所有语言的字符(包括法语重音字符),不需要额外写字符范围,彻底规避Unicode编码错误 - 直接用
\n匹配换行分隔两行,不需要开启multiline模式,避免行首行尾匹配的歧义问题
- 用
- 编码兼容:如果仍有字符编码报错,在playbook层级添加变量
ansible_python_interpreter: /usr/bin/python3,强制使用Python3执行,Python3默认全链路UTF-8编码,可解决所有非英文字符的解析问题
匹配效果说明
针对你给出的示例日志,上述正则会提取到配对的两行内容:
- 第一组捕获:
02/11/2021 17:14:51;Error validating properties for broker : OUTBOUND RabbitMQ - 第二组捕获:
java.lang.Exception: ERREUR::Exception lors de l'ouverture du channel[Connection timed out: connect]
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

