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

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

原正则的问题

  1. 未单独匹配线程字段,将线程标识混入了message组
  2. 时间戳中的.未转义,可能匹配到非数字字符
  3. 未处理多行消息的情况,只能捕获第一行的部分内容

内容的提问来源于stack exchange,提问作者Bhanu Praveen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:01:09