如何使用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
相关产品推荐
相关产品推荐

