Fluent Bit中用Ruby正则解析Tomcat多行Catalina日志遇线程字段提取问题
Catalina日志解析:提取时间、级别、线程和消息
针对你提供的Catalina多行日志,调整正则表达式即可单独提取Thread字段,同时正确捕获多行消息内容:
修正后的正则表达式
(?ms)^>\s*(?<log_time>\d{1,2}-[A-Za-z]+-\d{4} \d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3})\s+(?<severity>\w+)\s+(?<thread>\[[^\]]+\])\s*\r?\n(?:>\s*(?<message>.*(?:\r?\n>\s*.*)*))
正则解释
(?ms):启用多行模式(让^匹配每行开头)和单行模式(让.匹配换行符,支持多行消息捕获)^>\s*:匹配日志行开头的>符号及后续空白字符(?<log_time>...):捕获时间戳,注意将原正则中的.转义为\.(避免匹配任意字符)(?<severity>\w+):捕获日志级别(如INFO、ERROR等)(?<thread>\[[^\]]+\]):捕获线程信息,匹配[开头、]结尾的完整线程标识\s*\r?\n:匹配第一行结尾的空白和换行符(?<message>...):捕获后续所有以>开头的日志行,自动去除每行开头的>和空白,拼接成完整消息
验证示例(Python)
import re log_text = """> 21-Aug-2024 04:51:02.916 INFO [http-nio-16500-exec-3] > org.apache.coyote.http11.Http11Processor.service Error parsing HTTP > request header""" regex_pattern = re.compile(r'(?ms)^>\s*(?<log_time>\d{1,2}-[A-Za-z]+-\d{4} \d{1,2}:\d{1,2}:\d{1,2}\.\d{1,3})\s+(?<severity>\w+)\s+(?<thread>\[[^\]]+\])\s*\r?\n(?:>\s*(?<message>.*(?:\r?\n>\s*.*)*))') match_result = regex_pattern.match(log_text) if match_result: print(f"Time: {match_result.group('log_time')}") print(f"Severity: {match_result.group('severity')}") print(f"Thread: {match_result.group('thread')}") print(f"Msg:\n{match_result.group('message')}")
执行后输出:
Time: 21-Aug-2024 04:51:02.916 Severity: INFO Thread: [http-nio-16500-exec-3] Msg: org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header
原正则的问题
- 未单独匹配线程字段,将线程标识混入了
message组 - 时间戳中的
.未转义,可能匹配到非数字字符 - 未处理多行消息的情况,只能捕获第一行的部分内容
内容的提问来源于stack exchange,提问作者Bhanu Praveen
相关产品推荐
相关产品推荐

