保存文件带时间戳

from datetime import datetime
current_time = datetime.now().strftime(‘%Y%m%d%H%M’)

import threading
_lock = threading.Lock()
LOG_DIR = 'bit_log'
os.makedirs(LOG_DIR, exist_ok=True)

def _log(msg: str):
    """带时间戳写日志(线程安全)"""
    day = datetime.date.today().strftime('%Y%m%d')
    log_path = os.path.join(LOG_DIR, f'{day}.log')
    ts = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
    with _lock:                       # 保证多线程不串写
        with open(log_path, 'a', encoding='utf-8') as f:
            f.write(f'[{ts}] {msg}\n')
            f.flush()                 # 立即落盘,防止异常崩溃丢缓冲
            
_log(f"{name} ---- 解析失败")

<think> 我们之前已经讨论过,Jenkins默认的控制台输出可以通过Timestamper插件添加时间戳,但原始日志文件(例如`builds/<build_id>/log`)本身并不包含时间戳。用户现在的问题是:如何让Jenkins的日志文件永久保存时间戳的版本? 分析需求: 用户希望将时间戳的日志内容永久保存下来,而不仅仅是控制台输出中显示。也就是说,需要生成一个包含时间戳的日志文件,并且能够长期保存。 可能的解决方案: 1. 使用Jenkins的归档功能:在构建后步骤中归档时间戳的日志文件。 2. 通过重定向或脚本处理:在构建过程中,将时间戳的控制台输出重定向到一个文件,然后保存文件。 然而,需要注意的是,Jenkins默认的日志文件(在构建目录下的`log`文件)是原始的不时间戳的。Timestamper插件只是在控制台输出(网页上)添加了时间戳,并没有改变原始日志文件。 因此,我们需要在构建过程中生成一个时间戳的日志文件,并将其归档。 具体步骤: 方法一:使用Timestamper插件配合日志重定向(推荐) 步骤1:在Jenkins项目中安装并配置Timestamper插件(如之前所述)。 步骤2:在构建过程中,通过脚本将控制台输出(时间戳)重定向到一个文件。但是,由于Timestamper插件是在Jenkins的日志输出流中插入时间戳,我们可以利用Jenkins提供的时间戳的日志流来生成文件。 在Pipeline项目中,我们可以使用`timestamps`块包裹整个构建过程,同时使用`tee`命令将输出同时重定向到文件和控制台。 示例Pipeline脚本: ```groovy pipeline { agent any options { timestamps() // 启用时间戳插件 } stages { stage('Build') { steps { script { // 使用tee命令将时间戳的输出同时发送到文件和控制台 // 注意:可能需要使用shell脚本包装 sh ''' # 确保日志目录存在 mkdir -p ${WORKSPACE}/logs # 执行构建命令,并使用tee将输出同时写入文件和控制台 # 注意:这里使用时间戳的日志流,但Jenkins的timestamps()已经为输出流添加了时间戳 # 因此,我们只需要将输出同时保存文件即可 echo "Starting build at `date`" # 使用tee命令将标准输出和标准错误都重定向到文件并同时显示在控制台 your_build_command_here 2>&1 | tee ${WORKSPACE}/logs/build-with-timestamps.log ''' } } } } post { always { archiveArtifacts artifacts: 'logs/*.log', allowEmptyArchive: true } } } ``` 解释: - `timestamps()`选项确保控制台输出每行都有时间戳。 - 在shell命令中,我们使用`tee`命令将命令的输出同时显示在控制台(因此会经过Jenkins的日志系统并加上时间戳)和保存文件中。但是注意:由于Jenkins的日志系统在输出流中插入时间戳,所以`tee`捕获的流实际上已经包含了时间戳。因此,保存文件的内容也会包含时间戳。 - 最后,在`post`步骤中,我们使用`archiveArtifacts`将日志文件归档,这样每次构建后都会保存这个时间戳的日志文件。 方法二:手动添加时间戳(不依赖Timestamper插件) 如果不想使用Timestamper插件,也可以在构建脚本中手动为每一行添加时间戳。例如,使用`awk`命令: ```groovy pipeline { agent any stages { stage('Build') { steps { sh ''' mkdir -p ${WORKSPACE}/logs # 使用awk为每一行添加时间戳,并同时输出到控制台和文件 your_build_command_here 2>&1 | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush() }' | tee ${WORKSPACE}/logs/build-with-timestamps.log ''' } } } post { always { archiveArtifacts artifacts: 'logs/*.log', allowEmptyArchive: true } } } ``` 这种方法的好处是不需要安装插件,但时间戳的格式和位置由自己控制。 方法三:对于自由风格项目(非Pipeline) 如果是自由风格项目,可以: 1. 在构建环境中勾选“Add timestamps to the Console Output”(需要Timestamper插件)。 2. 在构建步骤中,使用脚本(如上述的`awk`方法)将时间戳的输出保存文件,或者使用Jenkins提供的环境变量和重定向。 3. 在“构建后操作”中添加“归档成品”,指定生成的日志文件。 注意:自由风格项目没有直接的Pipeline的`tee`方式,但可以用脚本实现类似效果。 永久保存:归档后的文件将作为构建的产物保存在Jenkins中,即使原构建日志被清理,归档的日志文件也可以保留(取决于Jenkins的归档设置)。 补充:关于日志清理 Jenkins默认会清理构建记录(包括构建的控制台日志),但归档的成品不会被自动清理(除非配置了“丢弃旧的构建”并设置了归档成品的保留策略)。因此,如果需要长期保存,请确保在项目的“丢弃旧的构建”设置中,设置归档成品的保留天数或数量。 总结: 要实现日志文件永久保存时间戳版本,关键在于在构建过程中生成一个时间戳的日志文件,并将其归档。以上提供了两种主要方法(使用Timestamper插件配合tee,或使用awk手动添加时间戳),并适用于Pipeline和自由风格项目。 相关问题: 1. 如何配置Jenkins以保留归档的日志文件更长时间? 2. 如何在Jenkins自由风格项目中使用脚本添加时间戳保存日志? 3. 使用Timestamper插件和手动添加时间戳有何优缺点? 4. 如何避免日志文件过大影响Jenkins性能? </think> ### Jenkins日志文件永久保存时间戳版本的方法 要使Jenkins日志文件永久保存时间戳版本,可通过以下方法实现(无需修改原始日志文件): #### 方法一:构建过程中生成时间戳日志(推荐) 在Pipeline中结合`timestamps()`和日志归档功能: ```groovy pipeline { agent any options { timestamps() // 启用时间戳[^1] } stages { stage('Build') { steps { script { // 生成时间戳的日志文件 sh ''' mkdir -p ${WORKSPACE}/logs echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始构建" > ${WORKSPACE}/logs/timestamped.log your_build_command | awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' >> ${WORKSPACE}/logs/timestamped.log ''' } } } } post { always { archiveArtifacts artifacts: 'logs/*.log', allowEmptyArchive: true // 归档日志文件[^4] } } } ``` #### 方法二:构建后处理日志文件 使用`post`阶段添加时间戳并归档: ```groovy post { always { script { // 添加时间戳到原始日志 sh ''' awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' ${BUILD_LOG} > ${WORKSPACE}/timestamped.log ''' // 永久保存到自定义目录 sh ''' mkdir -p /var/jenkins_logs cp ${WORKSPACE}/timestamped.log /var/jenkins_logs/build_${BUILD_ID}.log ''' } archiveArtifacts 'timestamped.log' // 归档到Jenkins[^1] } } ``` ### 关键配置说明 1. **日志归档路径** - 使用`archiveArtifacts`将日志作为构建产物保存 - 默认存储路径:`$JENKINS_HOME/jobs/<job_name>/builds/<build_id>/archive/` 2. **永久保存策略** 在项目配置中设置构建保留策略: ``` 丢弃旧的构建 → 高级 → 保留构建的日志天数: 永久 ``` 3. **时区设置(确保时间准确)** 在 **Manage Jenkins → Script Console** 执行: ```groovy System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai') // 设为北京时间[^2] ``` ### 效果验证 1. 构建后查看 **Build Artifacts** 中的日志文件 2. 文件内容示例: ``` [2023-08-15 14:30:45] Started by user admin [2023-08-15 14:31:02] [INFO] Building workspace... ``` > 此方法不修改Jenkins原始日志文件,而是创建副本并添加时间戳,避免影响系统稳定性[^4]。 --- ### 相关问题 1. 如何自定义Jenkins日志时间戳格式? 2. 如何将时间戳的日志自动备份到外部存储? 3. 在自由风格项目中如何实现日志时间戳归档? 4. 如何批量处理历史构建日志添加时间戳? [^1]: 引用 [^2]: 引用 [^4]: 引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值