Java逐行读取日志提取AppSessionId及对应requestBody的问题求助
问题解决说明
错误原因
- 你将requestBody的匹配逻辑嵌套在了
Inside /buyairtime行的判断分支内,只有当前行是/buyairtime日志行时才会执行内部判断,但requestBody内容在该行的下一行,永远无法被该分支命中,因此拿不到对应内容。 - 代码存在变量名不一致问题:定义的会话ID变量名为
AppSessionId,但日志输出时使用了未声明的sessionId,会出现编译错误。 lines().forEach()属于无状态遍历,无法暂存上一行提取的AppSessionId给后续行做匹配使用。
修正后代码
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class LogParseDemo { // 匹配transactionId的正则 private static final Pattern TRANSACTION_PATTERN = Pattern.compile("\"transactionid\":\"(.*?)\""); public void parseLog(String logFilePath) { // 暂存提取到的待匹配AppSessionId String targetAppSessionId = null; try (BufferedReader br = new BufferedReader(new FileReader(logFilePath))) { String line; while ((line = br.readLine()) != null) { // 匹配/buyairtime行,提取AppSessionId if (line.contains("Inside /buyairtime")) { String[] item = line.split("\\|"); targetAppSessionId = item[1].trim(); System.out.println("AppSessionId = " + targetAppSessionId); continue; } // 匹配对应AppSessionId的requestBody行 if (targetAppSessionId != null && line.contains(targetAppSessionId) && line.contains("requestBody")) { String[] request = line.split("\\|"); String requestBody = request[2].replace("#", "").trim(); System.out.println("requestBody = " + requestBody); // 提取transactionId,也可以用Gson/Jackson等JSON工具直接解析 Matcher matcher = TRANSACTION_PATTERN.matcher(requestBody); if (matcher.find()) { String transactionId = matcher.group(1); System.out.println("transactionId = " + transactionId); } // 匹配完成后重置标识,避免误匹配后续无关行 targetAppSessionId = null; } } } catch (IOException e) { e.printStackTrace(); } } }
逻辑说明
- 新增
targetAppSessionId变量暂存从/buyairtime行提取到的会话ID,供后续行匹配使用 - 拆分两个判断分支:第一个分支专门提取待匹配的会话ID,第二个分支专门匹配对应的requestBody行
- 匹配到requestBody后通过正则提取transactionId,也可以根据需求引入JSON解析工具解析requestBody字符串获取字段值
- 匹配完成后重置暂存的会话ID,避免后续无关行被错误匹配
内容的提问来源于stack exchange,提问作者BALDE
相关产品推荐
相关产品推荐

