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

借助ELK从日志获取Jenkins构建数据:整体构建时间获取难题

解决Jenkins Pipeline整体构建时长无法从日志采集的问题

我完全懂你的困扰——Jenkins控制台日志里能看到各阶段耗时,但核心日志压根不会主动输出Pipeline的整体构建时长,哪怕调了全局日志级别也没用。这是因为整体构建时长属于构建元数据范畴,并不是Jenkins默认控制台日志的输出内容。下面给你几个可行的解决方案,按实现复杂度从低到高排序:

方案1:在Pipeline脚本中主动输出整体时长

这是最直接快速的办法,在你的Pipeline里加一个post阶段,等构建结束后主动把整体时长打印到控制台日志,这样Filebeat就能采集到,后续Logstash也能轻松解析。

示例Pipeline代码

pipeline {
    agent any
    stages {
        stage('代码拉取') {
            steps {
                git url: 'https://your-repo-url.git', branch: 'main'
            }
        }
        stage('编译构建') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        // 其他自定义阶段...
    }
    post {
        always { // 不管构建成功失败都执行
            script {
                // currentBuild是Jenkins内置对象,直接拿时长信息
                def formattedDuration = currentBuild.durationString // 比如"1分30秒"这种格式化后的文本
                def durationMs = currentBuild.duration // 毫秒数,方便后续做数值统计
                echo "===== 构建元数据 ====="
                echo "任务名称: ${env.JOB_NAME}"
                echo "构建编号: ${currentBuild.number}"
                echo "整体构建时长(格式化): ${formattedDuration}"
                echo "整体构建时长(毫秒): ${durationMs}"
                echo "构建状态: ${currentBuild.result ?: '进行中'}"
            }
        }
    }
}

对应的Logstash Grok配置

在你现有的Grok规则里加这两行,就能把时长字段提取出来:

%{DATA:metadata_header} 整体构建时长\(格式化\): %{DATA:total_build_duration}
%{DATA:metadata_header} 整体构建时长\(毫秒\): %{NUMBER:total_build_duration_ms:int}

之后在Kibana里,你就能直接用total_build_duration或total_build_duration_ms来统计、展示整体构建时长了。

方案2:通过Jenkins API拉取构建元数据

如果不想逐个修改Pipeline脚本,可以用Logstash的http过滤器,在处理日志时,根据日志里的任务名称和构建编号,调用Jenkins API获取整体时长,再把这个字段注入到日志事件里。

示例Logstash配置片段

filter {
    # 先从现有日志里提取任务名称和构建编号(得确保你的日志里能拿到这些信息,或者通过其他字段推导)
    grok {
        match => { "message" => "任务名称: %{DATA:job_name}" }
        match => { "message" => "构建编号: %{NUMBER:build_number:int}" }
    }

    # 调用Jenkins API获取构建详情
    http {
        url => "http://your-jenkins-address/job/%{job_name}/%{build_number}/api/json"
        verb => "GET"
        # 如果Jenkins开了权限验证,要加API Token(在Jenkins用户设置里生成)
        headers => {
            "Authorization" => "Bearer your-jenkins-api-token"
        }
        # API返回的内容存到jenkins_build_data字段里
        target_body => "jenkins_build_data"
        # 提取时长字段(duration是毫秒数)
        add_field => { "total_build_duration_ms" => "%{[jenkins_build_data][duration]}" }
    }

    # 转换字段类型,顺便算出秒数方便展示
    mutate {
        convert => { "total_build_duration_ms" => "integer" }
        add_field => { "total_build_duration_sec" => "%{total_build_duration_ms}/1000" }
    }
}

注意:要给Logstash所在机器开放Jenkins API的访问权限,并且确保API Token有足够的权限读取构建信息。

方案3:用Jenkins插件增强日志输出

有些Jenkins插件可以自动把构建元数据输出到控制台日志,比如:

  • Build Time Tracker Plugin:能记录并输出构建各阶段和整体的时长
  • Pipeline Utility Steps Plugin:提供更多Pipeline内置工具,方便获取和输出元数据

安装插件后,需要在全局配置或者Pipeline里启用日志输出功能,这样控制台日志里就会包含整体构建时长,后续的采集和解析流程和方案1一致。

总结下来,方案1最轻量,适合快速落地;方案2不用改Pipeline,但依赖Jenkins API的稳定性;方案3适合有大量Pipeline且不想逐个修改的场景,你可以根据自己的实际情况选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:34