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
相关产品推荐
相关产品推荐

