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

Snakemake重试时日志被覆盖,求规范的日志追加方法

解决Snakemake重试时日志被覆盖的规范方案

针对你的问题,核心原因是Snakemake默认会在每次重试规则前删除log指令指定的日志文件,导致即使你用>>追加也会被清空。以下是符合Snakemake规范的解决方案,分版本适配:

方案一:Snakemake 7.15.0及以上版本(推荐)

从7.15.0版本开始,Snakemake支持在log指令中添加append=True参数,直接实现重试时日志追加,无需修改shell逻辑:

rule flaky_rule:
    input:
        infile = "{sample}/foo.txt"
    output:
        outfile = "{sample}/bar.txt"
    retries: 3
    log:
        # 对单个日志文件启用追加模式
        flaky_rule_log = log("{sample}/logs/flaky_rule.log", append=True)
    shell:  
        """
        flaky_script -i "{input.infile}" -o "{output.outfile}" >> "{log.flaky_rule_log}" 2>&1 
        """

也可以为所有日志文件全局启用追加:

log:
    flaky_rule_log = "{sample}/logs/flaky_rule.log",
    append = True

方案二:Snakemake 7.7.0(你的当前版本)

由于该版本不支持append参数,可通过以下两种规范方式实现:

方式1:结合shadow模式追加日志

使用shadow: "minimal"模式,让Snakemake在临时目录执行规则,避免删除主日志文件,再将临时日志追加到目标文件:

rule flaky_rule:
    input:
        infile = "{sample}/foo.txt"
    output:
        outfile = "{sample}/bar.txt"
    retries: 3
    log:
        flaky_rule_log = "{sample}/logs/flaky_rule.log"
    shadow: "minimal"
    shell:  
        """
        # 先将命令输出写入临时日志
        flaky_script -i "{input.infile}" -o "{output.outfile}" > temp_run.log 2>&1
        # 追加到主日志文件
        cat temp_run.log >> "{log.flaky_rule_log}"
        """

方式2:手动备份恢复日志

在shell中先备份现有日志,执行命令后将备份内容追加到新日志,避免Snakemake清空日志:

rule flaky_rule:
    input:
        infile = "{sample}/foo.txt"
    output:
        outfile = "{sample}/bar.txt"
    retries: 3
    log:
        flaky_rule_log = "{sample}/logs/flaky_rule.log"
    shell:  
        """
        # 备份现有日志(如果存在)
        LOG_FILE="{log.flaky_rule_log}"
        if [ -f "$LOG_FILE" ]; then
            cp "$LOG_FILE" "$LOG_FILE.tmp.bak"
        fi

        # 执行命令写入日志
        flaky_script -i "{input.infile}" -o "{output.outfile}" > "$LOG_FILE" 2>&1

        # 将备份内容追加到新日志
        if [ -f "$LOG_FILE.tmp.bak" ]; then
            cat "$LOG_FILE.tmp.bak" >> "$LOG_FILE"
            rm "$LOG_FILE.tmp.bak"
        fi
        """

以上方案均符合Snakemake规范,不会触发代码检查工具的日志未设置警告,同时保留每次重试的输出内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:11:11