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

如何使用Groovy提取指定时间范围内的Jenkins构建日志

Jenkins日志按时间范围筛选实现方案

原时间转换代码失败原因

  1. 格式字符串与Jenkins日志的时间结构不匹配:
    示例日志时间2021-12-01T09:19:54-07:00的结构为年-月-日T时:分:秒时区偏移,但你的格式串错误将秒的占位符ss放在了时区符号-之后,还错误将时区部分写死为:00,导致解析失败。
  2. 类型转换错误:Date.parse()返回的是Date类型,你直接赋值给String类型变量会抛出类型不匹配异常。
  3. 旧版Date.parse()方法在不同Groovy版本中兼容性较差,更推荐使用SimpleDateFormat或Java 8+的java.time类库做时间解析。

正确时间转换测试代码

import java.text.SimpleDateFormat
import java.util.Date

String log_time = "2021-12-01T09:19:54-07:00"
// 匹配ISO 8601带时区偏移的标准格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
Date logDate = sdf.parse(log_time)
println(logDate)

完整时间范围筛选脚本

import java.text.SimpleDateFormat
import java.util.Date
import jenkins.model.Jenkins
import hudson.model.Job

// 可修改的配置项
def JOBNAME = 'My_Jenkins_job'
def BUILDID = '34'
// 定义筛选的起止时间,格式与日志时间格式保持一致即可
def START_TIME_STR = "2021-11-30T08:23:00-07:00"
def END_TIME_STR = "2021-11-30T08:25:59-07:00"
// 时间格式模板,和Jenkins日志前缀的时间格式完全匹配
def TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ssXXX"
// 日志时间前缀的字符长度,按需调整,避免全量正则匹配提升性能
def TIME_PREFIX_LENGTH = 25

SimpleDateFormat sdf = new SimpleDateFormat(TIME_PATTERN)
Date startTime = sdf.parse(START_TIME_STR)
Date endTime = sdf.parse(END_TIME_STR)

// 遍历匹配任务和构建
Jenkins.instance.getAllItems(Job.class).each { job ->
    if (job.name == JOBNAME) {
        job.builds.each { build ->
            if (build.id == BUILDID) {
                def matchedLines = []
                build.logFile.readLines().each { line ->
                    try {
                        // 提取行首的时间部分转换为日期对象
                        String timeStr = line.take(TIME_PREFIX_LENGTH)
                        Date lineTime = sdf.parse(timeStr)
                        // 时间范围判断
                        if (lineTime >= startTime && lineTime <= endTime) {
                            matchedLines.add(line)
                        }
                    } catch (Exception e) {
                        // 跳过无时间前缀的异常行,比如空行、非结构化输出行
                        return
                    }
                }
                // 输出筛选结果
                println '=' * 60
                println "Log summary between ${START_TIME_STR} and ${END_TIME_STR}"
                println '=' * 60
                matchedLines.each { println it }
            }
        }
    }
}

注意事项

  • 如果你的Jenkins日志时间前缀没有时区、或者格式不同,只需对应调整TIME_PATTERN和TIME_PREFIX_LENGTH即可。比如时间格式为2021-11-30 08:23:00,就把TIME_PATTERN改为yyyy-MM-dd HH:mm:ss
  • 比原字符串匹配方案灵活性更高,支持跨小时、跨天的时间范围筛选,不需要拼接多个前缀字符串
  • 异常捕获逻辑可以避免无时间前缀的日志行导致脚本意外终止

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:54:06