当前位置: 首页 > article >正文

java 读取log日志文件关键信息

示例代码

        String logFilePath = "C:\\Users\\v2402001\\Downloads\\11111_  none  _PSV975S3666001_09-10-2024_05.33.02_PM.log";
        Map<String, Pattern> fieldPatterns = new HashMap<>();
        fieldPatterns.put("Devices Picked Input", Pattern.compile("Devices Picked Input:\\s*(\\d+)"));
        fieldPatterns.put("User ID", Pattern.compile("User ID:\\s*(\\w+)"));
        fieldPatterns.put("Log Generation Time", Pattern.compile("Date Logged:\\s*(\\S+)"));
          Map<String, String> result = new HashMap<>();
        try {
            BufferedReader reader = new BufferedReader(new FileReader(logFilePath));
            String logContent = "";
            String line;
            while ((line = reader.readLine())!= null) {
                logContent += line + "\n";
            }
            reader.close();

            for (Map.Entry<String, Pattern> entry : fieldPatterns.entrySet()) {
                Pattern pattern = entry.getValue();
                Matcher matcher = pattern.matcher(logContent);
                if (matcher.find()) {
                    result.put(entry.getKey(), matcher.group(1));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

以下是对上述代码进行解析整理后形成的技术文档内容:

1. 代码功能概述

这段Java代码的主要功能是从指定的日志文件中提取特定字段的值,并将这些值存储在一个Map中以便后续使用。它通过定义特定字段的正则表达式模式,在日志文件内容中进行匹配查找,从而获取相应字段的值。

2. 代码详细解析

2.1 变量定义
  • logFilePath
    • 类型:String
    • 作用:定义了要读取的日志文件的路径,示例路径为 "C:\\Users\\v2402001\\Downloads\\11111_ none _PSV975S3666001_09-10-2024_05.33.02_PM.log"。通过这个路径,代码能够找到并打开对应的日志文件进行读取操作。
  • fieldPatterns
    • 类型:Map<String, Pattern>
    • 作用:用于存储特定字段及其对应的正则表达式模式。通过put方法向这个Map中添加了三个键值对,分别是:
      • "Devices Picked Input",值为一个编译后的正则表达式模式 Pattern.compile("Devices Picked Input:\\s*(\\d+)"),用于匹配日志文件中 “Devices Picked Input” 字段后面跟着的数字内容。
      • "User ID",值为 Pattern.compile("User ID:\\s*(\\w+)"),用于匹配日志文件中 “User ID” 字段后面跟着的字母数字字符内容。
      • "Log Generation Time",值为 Pattern.compile("Date Logged:\\s*(\\S+)"),用于匹配日志文件中 “Date Logged” 字段后面跟着的非空白字符内容。
  • result
    • 类型:Map<String, String>
    • 作用:用于存储从日志文件中成功匹配并提取到的特定字段的值。在后续代码执行过程中,当在日志文件内容中找到与 fieldPatterns 中某个模式匹配的内容时,就会将对应的字段名作为键,匹配到的值作为值存入这个 Map 中。
2.2 读取日志文件内容
  • 使用 BufferedReader 来读取日志文件内容,具体步骤如下:
    • 创建 BufferedReader 对象:通过 new BufferedReader(new FileReader(logFilePath)) 创建一个 BufferedReader,它将从指定的 logFilePath 所指向的日志文件中读取内容。
    • 逐行读取并拼接内容:通过一个 while 循环,不断调用 reader.readLine() 方法读取日志文件中的每一行内容,并将每行内容拼接到 logContent 变量中,每行之间用换行符 "\n" 分隔。循环会一直执行,直到读取到文件末尾(即 reader.readLine() 返回 null)。
    • 关闭读取器:在读取完所有行后,通过 reader.close() 关闭 BufferedReader,释放相关资源。
2.3 提取特定字段的值
  • 遍历 fieldPatterns 中的每个键值对:通过 for (Map.Entry<String, Pattern> entry : fieldPatterns.entrySet()) 循环遍历 fieldPatterns 这个 Map 中的所有元素。在每次循环中,entry 变量代表一个键值对,其中 entry.getKey() 是特定字段名,entry.getValue() 是对应的正则表达式模式。
  • 进行模式匹配:对于每个字段对应的模式,使用 Matcher 进行匹配操作。具体步骤如下:
    • 创建 Matcher 对象:通过 Matcher matcher = pattern.matcher(logContent),创建一个 Matcher 对象,用于在拼接好的日志文件内容 logContent 中查找与当前模式 pattern(即 entry.getValue())匹配的内容。
    • 检查是否匹配成功:通过 matcher.find() 方法检查在日志文件内容中是否能找到与当前模式匹配的内容。如果找到匹配内容,则表示成功提取到了该字段的值。
    • 存储匹配结果:如果匹配成功,通过 result.put(entry.getKey(), matcher.group(1)) 将对应的字段名作为键,匹配到的值(通过 matcher.group(1) 获取匹配到的第一个分组内容,这里根据之前定义的正则表达式模式,分组内容就是我们要提取的字段值)作为值存入 result 这个 Map 中。
2.4 异常处理
  • 在整个代码执行过程中,如果在读取日志文件(通过 BufferedReader 读取)过程中出现 IOException(例如文件不存在、无法打开文件、读取权限问题等),代码会通过 catch (IOException e) 捕获该异常,并通过 e.printStackTrace() 打印出异常的堆栈跟踪信息,以便于调试和定位问题所在。

3. 代码总结

通过以上步骤,这段代码实现了从指定的日志文件中按照预定义的正则表达式模式提取特定字段的值,并将这些值存储在一个 Map 中。这种方式可以方便地对日志文件进行分析,获取关键信息用于后续的处理、统计或展示等操作。同时,通过合理的异常处理机制,能够在出现问题时提供一定的调试信息。


http://www.kler.cn/a/392735.html

相关文章:

  • 前端Python应用指南(二)深入Flask:理解Flask的应用结构与模块化设计
  • Element-ui的使用教程 基于HBuilder X
  • iClient3D for Cesium 加载shp数据并拉伸为白模
  • 【赵渝强老师】MongoDB逻辑存储结构
  • 低空经济的地理信息支撑:构建安全、高效的飞行管理体系
  • TGRS | 可变形傅里叶卷积用于遥感道路分割
  • BeanUtils.copyProperties,拷贝后,修改target对象的字段,如果保证source对象字段不会变化
  • 2024年9月 GESP CCF C++六级编程能力等级考试认证真题
  • Jailbreaking ChatGPT via Prompt Engineering: An Empirical Study
  • 手术机器人:精准医疗的新选择
  • blind-watermark - 水印绑定
  • 大数据新视界 -- 大数据大厂之 Impala 在大数据架构中的性能优化全景洞察(上)(13/30)
  • CSS Modules中的 :global
  • 矩阵的各种计算:乘法、逆矩阵、转置、行列式等——基于Excel实现
  • 遇到Word打不开,WPS可以打开的解决办法
  • ES6字符串的新增方法
  • 微服务架构面试内容整理-API 网关-Gateway
  • (68)希尔伯特变换、解析信号,与瞬时幅度、频率和相位的提取的MATLAB仿真
  • 《C陷阱与缺陷》
  • 缓存淘汰策略及其使用场景详解
  • 效率工具-tig的使用
  • 最新的ssl证书有效期只有3个月,ssl到期后如何处理?
  • Java Http 接口对接太繁琐?试试 UniHttp 框架吧
  • Unity Assembly Definition Assembly Definition Reference
  • Python网络爬虫与数据采集实战——网络爬虫的基本流程
  • xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer