Zabbix日志监控正则问题:匹配含[ERR]的连续3行日志
解决Zabbix中匹配Windows日志含[ERR]的三行内容问题
正确的Perl正则表达式
要完整匹配包含[ERR]的第一行及后续两行,可使用以下正则:
^.*\Q[ERR]\E.*(?:\r\n?|\n).*(?:\r\n?|\n).*
如果需要单独捕获每行内容(方便后续Zabbix处理字段),可使用带捕获组的版本:
^.*\Q[ERR]\E\s*(.*)(?:\r\n?|\n)(.*)(?:\r\n?|\n)(.*)
正则各部分说明
^:锚定行首,避免匹配日志文本中间偶然出现的[ERR]片段\Q[ERR]\E:转义匹配[ERR],方括号在正则中是特殊字符,用\Q和\E包裹可直接匹配原字符串.*:匹配当前行剩余的全部内容(无需非贪婪模式,此处需覆盖整行)(?:\r\n?|\n):匹配Windows(\r\n)或兼容类Unix(\n/\r)的换行符,非捕获组不占用分组编号- 重复的
.*:依次匹配后续两行的全部内容
针对你的日志示例测试
你的日志片段:
2023-03-15 18:14:31.149 -04:00 [ERR] Exception Time:
3/15/2023 6:14:31 PM Exception Message: Could not find file
'\XXXXX01\Files\51372\Working.xml'.
使用第一个正则会完整匹配这三行内容;使用带捕获组的版本时,三个捕获组分别对应:
Exception Time:3/15/2023 6:14:31 PM Exception Message: Could not find file'\XXXXX01\Files\51372\Working.xml'.
你之前正则的问题分析
你原正则中的(.*?){2}(.+)逻辑错误:
(.*?)是非贪婪匹配任意字符,{2}是让这个捕获组重复两次,而非匹配两行内容- 换行符的位置没有正确分隔行,导致正则无法识别完整的行结构
Zabbix配置注意事项
- 确保日志监控项开启多行匹配支持(Zabbix部分版本需手动启用,避免仅匹配单行)
- 如果使用捕获组,可在Zabbix的项目参数中引用分组值(如
$1、$2)用于告警或存储 - 可通过Zabbix内置的正则测试功能验证匹配效果,调整细节
内容的提问来源于stack exchange,提问作者ahess
相关产品推荐
相关产品推荐

