Python中.log文件彩色日志失效问题求助
问题根源
核心问题出在:coloredlogs.ColoredFormatter会给日志内容插入ANSI终端转义序列(就是你看到的那些奇怪字符)。这些序列是给终端识别渲染彩色用的,普通文本文件不会解析它们,只会原样显示,而且纯文本.log文件本身也没法直接显示彩色。
解决办法
要实现终端日志带彩色、文件日志干净无乱码的效果,得给终端和文件分别配置不同的格式化器:
import coloredlogs import logging # 初始化日志器 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 必须设置日志器的全局级别,否则低级别日志可能不输出 # 配置文件处理器:用普通格式化器输出纯文本 file_handler = logging.FileHandler('spam.log') file_handler.setLevel(logging.DEBUG) file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler.setFormatter(file_formatter) logger.addHandler(file_handler) # 配置终端处理器:用coloredlogs的彩色格式化器 coloredlogs.install( level='DEBUG', logger=logger, # 把彩色日志绑定到当前日志器,避免影响全局root日志 fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 测试输出 logger.debug("调试信息") logger.info("普通信息") logger.warning("警告信息") logger.error("错误信息") logger.critical("严重错误信息")
重点说明
- 绝对不要给
FileHandler用ColoredFormatter,它是专门给终端输出设计的,会自动插入ANSI转义码 - 文件日志用标准的
logging.Formatter,输出纯文本,彻底避免乱码问题 - 调用
coloredlogs.install()时指定logger=logger,是为了让彩色日志只作用于我们自己的日志器,不会干扰全局日志配置(可选,但更规范)
如果你的特殊需求是让.log文件用支持ANSI的工具打开时能显示彩色,那可以保留ColoredFormatter给文件处理器,但要清楚普通文本查看工具还是会显示那些转义字符,这种场景并不常见。
内容的提问来源于stack exchange,提问作者Aru Arundhathi
相关产品推荐
相关产品推荐

