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

如何用正则表达式匹配Tomcat日志条目?附日志片段示例

搞定Tomcat日志单条匹配的正则方案

我来帮你捋清楚怎么用正则匹配Tomcat日志里的单条条目!首先看你给出的日志片段,能发现两类内容:一类是异常堆栈的跟踪行(比如at java.net.Socket.<init>(Socket.java:434)或者... 31 more),另一类是真正的日志起始行——以dd.MM.yyyy HH:mm:ss,SSS格式的时间戳开头,后面跟着日志级别、线程名等信息。要逐个读取每条日志,核心就是找到单条日志的边界:从一个时间戳行开始,到下一个时间戳行之前的所有内容(包括关联的堆栈)都属于同一条日志。

1. 匹配完整单条日志的正则

这里给你一个支持跨多行匹配的正则表达式,能精准分割出每一条完整的Tomcat日志:

(?s)(\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},\d{3}\| .+?)(?=\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},\d{3}\||\Z)

正则细节解释:

  • (?s):开启单行模式,让.可以匹配换行符,这样就能捕获跨多行的异常堆栈内容
  • (\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},\d{3}\| .+?):捕获从时间戳行开始的所有内容,+?是非贪婪匹配,防止一次性匹配到日志末尾
  • (?=\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2},\d{3}\||\Z):正向预查终止条件,当匹配到下一个时间戳行或者日志文件末尾\Z时就停止,刚好分割出单条日志

2. 实际代码示例(以Java为例)

如果是用Java处理Tomcat日志文件,可以参考这段代码来逐个提取单条日志:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TomcatLogParser {
    public static void main(String[] args) throws Exception {
        // 读取整个日志文件内容
        String logContent = Files.readString(Paths.get("your-tomcat-log-file.log"));
        // 编译正则表达式
        Pattern logPattern = Pattern.compile("(?s)(\\d{2}\\.\\d{2}\\.\\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3}\\| .+?)(?=\\d{2}\\.\\d{2}\\.\\d{4} \\d{2}:\\d{2}:\\d{2},\\d{3}\\|\\|\\Z)");
        Matcher matcher = logPattern.matcher(logContent);
        
        // 逐个提取并处理单条日志
        while (matcher.find()) {
            String singleLog = matcher.group(1);
            // 这里可以添加你的业务逻辑,比如解析日志级别、异常信息等
            System.out.println("--- 提取到单条日志 ---");
            System.out.println(singleLog);
        }
    }
}

3. 单独匹配异常堆栈行的正则

如果你需要单独提取日志里的异常堆栈部分,可以用这个正则来匹配每一行堆栈内容:

^at .+?$|^\.\.\. \d+ more$

它能匹配所有以at 开头的堆栈跟踪行,以及... N more这类堆栈收尾行。

内容的提问来源于stack exchange,提问作者Borș Nicolae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:33:28