无法解析多行Tomcat日志正则模式,如何捕获完整单条日志内容?
Tomcat多行日志正则匹配解决方案
核心逻辑是把日志开头的固定时间格式作为单条日志的边界标识,所有非时间开头的内容均归属到上一条日志的msg字段。
正则调整方案
- 需先开启正则的两个匹配开关:
- 多行模式(MULTILINE):让
^可以匹配每一行的开头 - 单行模式(DOTALL):让
.可以匹配换行符
不同运行环境开启方式不同,Java中可通过Pattern.compile(正则, Pattern.MULTILINE | Pattern.DOTALL)设置,日志采集工具可直接在对应配置项中声明。
- 多行模式(MULTILINE):让
- 调整后的正则表达式:
^(?<time>[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9:,]+ [A-Z]+) (?<severity>[^ ]+) (?<msg>.*?)(?=\n[0-9]{4}-[0-9]{2}-[0-9]{2}|\Z)
调整说明
- 优化了
time分组的匹配规则,精准匹配年-月-日 时分秒,毫秒 时区的日志开头格式,减少误匹配概率- 新增正向零宽断言
(?=\n[0-9]{4}-[0-9]{2}-[0-9]{2}|\Z)作为msg的匹配终止条件:匹配到下一行开头为日期格式,或者到整个文本的末尾时停止捕获,实现跨行异常栈的完整收录msg分组使用非贪婪匹配.*?,避免把后续多条日志的内容都捕获到同一条日志的msg字段中
采集工具简化方案
如果你使用Filebeat、Logstash这类日志采集工具,不需要修改正则也可以快速实现多行合并,以Filebeat为例,配置如下:
filebeat.inputs: - type: log paths: - /你的tomcat日志路径/*.log multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after
该配置的作用为:所有不以日期开头的行,自动合并到上一行的末尾,完美适配提供的日志格式,自动将异常栈归属到对应日志的内容中。
内容的提问来源于stack exchange,提问作者PrasadKundeti
相关产品推荐
相关产品推荐

