如何编写Groovy脚本按块遍历日志并根据UAN查找MessageID
解决Groovy按日志块遍历查找UAN对应MessageID的问题
没问题,咱们可以直接通过Groovy的正则和文件处理能力来实现按BEGIN]和END]为边界的块遍历,而不需要逐行处理。先明确你的日志结构:
========================================================
BEGIN] MessageID: 123 UAN: 321END]BEGIN] MessageID: 111 UAN: 222END]BEGIN] MessageID: 343 UAN: 311END]
你的核心需求是按块解析这些日志,找到指定UAN对应的MessageID。下面是具体的实现代码,替代你之前依赖faker.logExtractor()的逻辑:
def fileName = "C:\\Users\\xxx\\Desktop\\log.txt"; def targetUan = "222" def matchedMessageId = null // 一次性读取整个日志文件内容,方便按块匹配 def logContent = new File(fileName).text // 正则表达式匹配每个BEGIN]到END]的完整块 // (?s) 启用单行模式,让.可以匹配换行符,确保捕获整个跨多行的块 def blockRegex = ~/(?s)BEGIN].*?END]/ def blockMatcher = blockRegex.matcher(logContent) // 遍历所有匹配到的日志块 while (blockMatcher.find()) { def currentBlock = blockMatcher.group() // 从当前块中提取MessageID和UAN def msgIdMatch = currentBlock =~ /MessageID: (\d+)/ def uanMatch = currentBlock =~ /UAN: (\d+)/ // 确保两个值都能被提取到 if (msgIdMatch.find() && uanMatch.find()) { def messageId = msgIdMatch.group(1) def uan = uanMatch.group(1) // 匹配目标UAN,找到后立即退出循环 if (uan == targetUan) { matchedMessageId = messageId break } } } // 输出结果(如果用日志框架就替换成log.info) if (matchedMessageId) { log.info "找到对应UAN的MessageID: $matchedMessageId" } else { log.info "未找到UAN为${targetUan}的日志块" }
代码说明:
- 按块读取:通过一次性读取整个文件内容,配合单行模式的正则表达式,直接捕获每个
BEGIN]到END]的完整块,比逐行拼接块要简洁高效。 - 正则解析:在每个块内部,用简单的正则提取MessageID和UAN的数值,避免复杂的字符串分割逻辑。
- 提前终止:找到匹配的UAN后立即跳出循环,减少不必要的遍历。
这个实现不需要依赖第三方的logExtractor方法,完全基于Groovy原生的文件和正则能力,更稳定可控。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

