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

如何编写Groovy脚本按块遍历日志并根据UAN查找MessageID

解决Groovy按日志块遍历查找UAN对应MessageID的问题

没问题,咱们可以直接通过Groovy的正则和文件处理能力来实现按BEGIN]和END]为边界的块遍历,而不需要逐行处理。先明确你的日志结构:

========================================================
BEGIN] MessageID: 123 UAN: 321
END]
BEGIN] MessageID: 111 UAN: 222
END]
BEGIN] MessageID: 343 UAN: 311

END]

你的核心需求是按块解析这些日志,找到指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:47