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

如何使用Python提取Jenkins输出日志中的时间戳并保存为txt或CSV文件

Jenkins Pipeline 内嵌Python脚本实现日志关键字+时间戳提取方案

技术选型说明

你提到的三个可选方向可直接按如下规则取舍:

  • 无需使用Python logging模块:logging模块用于生成Python脚本自身的运行日志,你的需求是读取Jenkins已输出的带时间戳的控制台日志,完全用不到该模块
  • 无需使用Jenkins wait_for_value 方法:该方法是Jenkins流水线原生用于等待指定变量更新的工具,实时监听日志的场景下直接用Python流式读取+正则匹配灵活性更高,也更容易适配自定义输出规则
  • 必须使用正则匹配:用来提取固定格式的时间戳,同时匹配多个预设关键字,实现效率最高

完整实现代码

1. Python处理脚本(log_extract.py)

所有参数都通过命令行传入,无需修改脚本代码即可调整配置,依赖全为Python标准库,无需额外安装

import re
import sys
import time
import csv
import os

# 匹配Jenkins日志的时间戳格式,和你给出的示例完全适配
TIMESTAMP_REGEX = re.compile(r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3})')

def main():
    # 接收命令行传入的参数,顺序为:
    # 匹配关键字(多个用英文逗号分隔)、输出格式(txt/csv)、输出模式(append/single)、循环执行次数、输出文件路径前缀
    keywords = sys.argv[1].split(',')
    output_format = sys.argv[2]
    output_mode = sys.argv[3]
    loop_count = int(sys.argv[4])
    output_prefix = sys.argv[5]

    for loop_idx in range(1, loop_count+1):
        # 确定当前循环的输出文件名
        if output_mode == 'single':
            output_file = f"{output_prefix}_{loop_idx}.{output_format}"
        else:
            output_file = f"{output_prefix}.{output_format}"
        
        # 存储本次循环匹配到的结果
        match_results = []

        # 这里直接读取标准输入,因为Jenkins会把流水线的输出流喂给脚本
        for line in sys.stdin:
            line = line.strip()
            if not line:
                continue
            # 先匹配时间戳
            ts_match = TIMESTAMP_REGEX.match(line)
            if not ts_match:
                continue
            timestamp = ts_match.group(1)
            # 匹配关键字
            for kw in keywords:
                if kw in line:
                    match_results.append((timestamp, kw, line))
                    break
        
        # 写入结果到文件
        if output_format == 'csv':
            # 检查文件是否存在,不存在就写表头
            file_exists = os.path.isfile(output_file)
            with open(output_file, 'a', encoding='utf-8', newline='') as f:
                writer = csv.writer(f)
                if not file_exists:
                    writer.writerow(['时间戳', '匹配关键字', '完整日志行'])
                writer.writerows(match_results)
        else:
            # txt格式写入
            with open(output_file, 'a', encoding='utf-8') as f:
                for res in match_results:
                    f.write(f"[{res[0]}] 匹配关键字:{res[1]} 完整日志:{res[2]}\n")
        
        # 循环间隔可根据需求调整,这里默认1秒
        time.sleep(1)

if __name__ == "__main__":
    main()

2. Jenkins Pipeline 调用配置

在你的流水线中加入如下Stage即可调用该脚本,参数可根据自己的需求修改:

pipeline {
    agent any
    stages {
        stage('执行日志提取') {
            steps {
                // 示例参数:匹配两个关键字、输出csv格式、追加写入同一个文件、循环执行3次、输出文件前缀为jenkins_log_result
                sh '''
                    your-build-command | python3 log_extract.py "Successfully sent the test record,任务执行完成" csv append 3 jenkins_log_result
                '''
            }
        }
    }
}

说明:把your-build-command替换为你实际要执行的构建命令即可,该命令的所有输出会直接喂给Python脚本做实时匹配。


自定义调整说明

  • 如果你的Jenkins日志时间戳格式和示例不同,直接修改TIMESTAMP_REGEX的正则规则即可
  • 如果关键字包含特殊符号,可在Python脚本的匹配逻辑里增加re.escape()处理避免匹配失效
  • 循环间隔可修改Python脚本最后time.sleep()的参数,单位为秒

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:36:02