Pycharm2023无法正确在控制台输出日志颜色
问题
使用logging模块时,无论什么level的日志,在Pycharm的控制台中总是显示红色。
图片来源
解决方案
Pycharm2023之前
可以将Run/Debug Configurations -> Emulate terminal in output console 选项打开。(博主只使用过Pycharm2021和2023,其他版本可以参考)
Pycharm2023
Pycharm2023似乎将Emulate terminal in output console 设置移除了,并没有找到相关选项,查询了资料后找到了解决方案:继承StreanHandler后override emit方法。但@davidgilbertson给出的方案虽然可以正确输出颜色,但没有考虑formatter,会导致无法正确格式化输出。
以下代码,可以以对应的颜色正确地格式化输出
代码
class ColorHandler(logging.StreamHandler):
GRAY8 = "38;5;8"
GRAY7 = "38;5;7"
ORANGE = "33"
RED = "31"
WHITE = "0"
PURPLE = "35"
BLUE = "34"
def emit(self, record):
try:
msg = self.format(record)
level_color_map = {
logging.DEBUG: self.BLUE,
logging.INFO: self.GRAY7,
logging.WARNING: self.ORANGE,
logging.ERROR: self.RED,
logging.CRITICAL: self.PURPLE
}
csi = f"{chr(27)}[" # control sequence introducer
color = level_color_map.get(record.levelno, self.WHITE)
self.stream.write(f"{csi}{color}m{msg}{csi}m\n")
self.flush()
except RecursionError:
raise
except Exception:
self.handleError(record)
log_handler_console = ColorHandler() # stdout to console
selfdef_fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
formatter = logging.Formatter(selfdef_fmt)
log_handler_console.setFormatter(formatter)
client_logger = logging.getLogger("# Client #")
client_logger.setLevel("DEBUG")
client_logger.addHandler(log_handler_console)