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

如何用logging模块模拟print函数的end=''参数行为?

解决print函数带end=''时日志同步的问题

我需要实现一个日志函数,将print语句的输出同步到日志文件,思路是重写print函数,先移除所有转义序列,再同时输出到屏幕和日志。这个方案绝大多数情况都能正常工作,但当原print语句带有end=''参数时,日志输出的换行行为无法和屏幕输出同步,该怎么解决?

初始代码

import logging
import builtins

# 假设remove_ansi_escape_codes是已实现的转义序列移除函数
def remove_ansi_escape_codes(text):
    # 示例实现,可根据实际需求调整
    import re
    return re.sub(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])', '', text)

if logProgram == True:
    logName_program = str(idCode)+"-program.log"
    logger_program = logging.getLogger('programlog')
    logger_program.setLevel(level=logging.DEBUG)
    logger_program.addHandler(logging.FileHandler(logName_program))

    def print(*args, **kwargs):
        output = " ".join(map(str, args))
        output = remove_ansi_escape_codes(output)
        logger_program.debug(output)
        builtins.print(*args, **kwargs)

解决方案

核心思路是通过修改日志文件处理器的terminator属性,匹配原print函数的end参数行为:当原print使用end=''时,让日志输出也不追加换行;否则保持默认的换行行为。

修改后的代码:

import logging
import builtins

def remove_ansi_escape_codes(text):
    import re
    return re.sub(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])', '', text)

if logProgram == True:
    logName_program = str(idCode)+"-program.log"
    logger_program = logging.getLogger('programlog')
    logger_program.setLevel(level=logging.DEBUG)
    fh = logging.FileHandler(logName_program)
    logger_program.addHandler(fh)

    def print(*args, **kwargs):
        output = " ".join(map(str, args))
        output = remove_ansi_escape_codes(output)

        if 'end' in kwargs and kwargs['end'] == '':
            fh.terminator = ''
        else:
            fh.terminator = '\n'
    
        logger_program.debug(output)

        builtins.print(*args, **kwargs)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:22:45