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

