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

Java日志文件解析:如何提取报错任务对应的用户信息

问题描述

我是计算机科学专业大一学生,已经实现从日志文件统计报错任务数量的功能,但因为日志行中用户信息的位置不固定,没法提取报错对应的用户信息。以下是我的Java代码、程序输出情况和日志文件示例,求解决办法。

当前Java代码
package Testing;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class testing {

    // 存储每个用户的报错次数
    private static Map<String, Integer> errorsPerUser = new HashMap<>();

    // 已启动任务数
    private static int jobsStarted = 0;

    // 已完成任务数
    private static int jobsCompleted = 0;

    public static void main(String[] args) {
        // 日志文件路径
        String filePath = "C:/Users/Wafiq/Documents/WIX1002/GroupAssignment/extracted_log.txt";

        try (Scanner scanner = new Scanner(new File(filePath))) {
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                int timestampEndIndex = line.indexOf("]");
                String lineWithoutTimestamp = line.substring(timestampEndIndex+2);
                // 检查是否包含目标错误信息
                if (lineWithoutTimestamp.contains("error: This association")) {
                    // 提取用户信息
                    String user = extractUser(lineWithoutTimestamp);
                    // 更新该用户的报错次数
                    incrementErrorCount(user);
                }
                // 统计任务启动数
                if (lineWithoutTimestamp.contains("sched: Allocate")) {
                    jobsStarted++;
                }
                // 统计任务完成数
                if (lineWithoutTimestamp.contains("_job_complete: JobId")) {
                    jobsCompleted++;
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // 输出统计结果
        System.out.println("Number of jobs started: " + jobsStarted);
        System.out.println("Number of jobs completed: " + jobsCompleted);
        System.out.println("Number of errors per user:");
        for (Map.Entry<String, Integer> entry : errorsPerUser.entrySet()) {
            System.out.println(": " + entry.getValue());
        }
    }

    // 提取用户信息的方法
    private static String extractUser(String line) {
        // 假设用户信息在"error"字符串之前
        return line.substring(0, line.indexOf("error")).trim();
    }

    // 更新用户报错次数的方法
    private static void incrementErrorCount(String user) {
        if (errorsPerUser.containsKey(user)) {
            errorsPerUser.put(user, errorsPerUser.get(user) + 1);
        } else {
            errorsPerUser.put(user, 1);
        }
        
    }
}
程序输出情况

输出显示:

  • Number of jobs started: 16
  • Number of jobs completed: 14
  • Number of errors per user:
  • : 2
    (用户列为空,未正确提取出用户信息)
日志文件示例内容

错误行格式示例:

[2023-10-01 12:34:56] user1: some operation info error: This association...
[2023-10-01 12:35:10] user3: another process log error: This association...

可见错误行的结构为[时间戳] 用户名: 其他内容 error: 错误信息,用户信息位于时间戳之后、第一个: 之前。

解决方案

根据日志的固定格式,可通过以下两种方式提取用户信息:

方法1:按分隔符拆分

利用: 作为分隔符,直接取时间戳后的第一个字段作为用户名,修改extractUser方法:

private static String extractUser(String lineWithoutTimestamp) {
    // 按": "拆分,第一个部分即为用户名
    if (lineWithoutTimestamp.contains(": ")) {
        return lineWithoutTimestamp.split(": ")[0].trim();
    }
    return "unknown_user"; // 处理格式异常的行
}

方法2:正则表达式匹配

用正则精准匹配用户名,适配更复杂的格式场景,修改extractUser方法:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

private static String extractUser(String lineWithoutTimestamp) {
    // 匹配行首到第一个": "之间的内容作为用户名
    Pattern pattern = Pattern.compile("^([^:]+):");
    Matcher matcher = pattern.matcher(lineWithoutTimestamp);
    if (matcher.find()) {
        return matcher.group(1).trim();
    }
    return "unknown_user";
}

额外优化建议

  • 统计结果中可选择过滤unknown_user,或单独记录此类异常行用于后续排查
  • 测试时可临时添加打印语句,验证提取的用户名是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:05:28