方式1:正则匹配

假设我当前的日志文件格式如下:

2024-02-29 20:57:11.129|INFO ||||69afe48a09964187a1b51192e1f9dae8||[http-nio-9527-exec-3]|c.z.a.config.LogAop - [afterReturning,119] - 
【<==request_id】:69afe48a09964187a1b51192e1f9dae8
【<==请求耗时】:9997毫秒

......此处省略一部分日志......

2024-02-29 20:57:19.310|INFO ||||65931ce2ec7f4cde9cf3b3ec19c8950e||[http-nio-9527-exec-4]|c.z.a.config.LogAop - [afterReturning,119] - 
【<==request_id】:65931ce2ec7f4cde9cf3b3ec19c8950e
【<==请求耗时】:293毫秒

......此处省略一部分日志......

Java代码如下:

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * @author : zanglikun
 * @date : 3/3/24 01:41
 * @desc : Copyright © zanglikun.com
 *
 * 我的日志文件中会包含:【<==请求耗时】:9997毫秒 这样的字符串,当前工具类统计每个日志文件中的请求耗时,并按照请求耗时从大到小排序输出。
 */
@Slf4j
public class LogFileCheckProcessRuntime {
    public static void main(String[] args) {
        String logDirectoryPath = "/Users/zanglikun/你的路径哦/";  // 替换为实际的日志文件目录路径,注意只会查找一级文件路径哦
        String keyword = "";  // 替换为你要匹配的关键词,可以使用空字符串匹配所有日志文件
        List<LogInfo> logInfoList = parseAndSortRequestTimesInDirectory(logDirectoryPath, keyword);
        for (LogInfo logInfo : logInfoList) {
            System.out.println("文件名: " + logInfo.getFileName() + ", 请求耗时: " + logInfo.getRequestTime() + " 毫秒");
        }
    }

    private static List<LogInfo> parseAndSortRequestTimesInDirectory(String logDirectoryPath, String keyword) {
        List<LogInfo> logInfoList = new ArrayList<>();
        File logDirectory = new File(logDirectoryPath);
        File[] logFiles = logDirectory.listFiles((dir, name) -> name.endsWith(".log") && name.contains(keyword));
        if (logFiles != null) {
            for (File logFile : logFiles) {
                List<Integer> requestTimes = parseRequestTimes(logFile);
                for (int time : requestTimes) {
                    logInfoList.add(new LogInfo(logFile.getName(), time));
                }
            }
        }
        logInfoList.sort(Collections.reverseOrder());
        return logInfoList;
    }

    private static List<Integer> parseRequestTimes(File logFile) {
        List<Integer> requestTimes = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(new FileReader(logFile))) {
            String line;
            Pattern pattern = Pattern.compile("【<==请求耗时】:(\\d+)毫秒");
            while ((line = br.readLine()) != null) {
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    int time = Integer.parseInt(matcher.group(1));
                    requestTimes.add(time);
                }
            }
        } catch (IOException e) {
            log.error("读取日志文件失败,错误信息如下:{}", ExceptionUtils.getMessage(e));
            e.printStackTrace();
        }
        return requestTimes;
    }

    @Data
    static class LogInfo implements Comparable<LogInfo> {
        private String fileName;
        private int requestTime;

        public LogInfo(String fileName, int requestTime) {
            this.fileName = fileName;
            this.requestTime = requestTime;
        }

        public String getFileName() {
            return fileName;
        }

        public int getRequestTime() {
            return requestTime;
        }

        @Override
        public int compareTo(LogInfo other) {
            return Integer.compare(this.requestTime, other.requestTime);
        }
    }
}
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤