如何装饰Python中的控制台日志消息?

2 投票
1 回答
803 浏览
提问于 2025-04-18 03:54

我在用Python写日志,想让控制台显示一些带颜色的消息(不是所有的消息)。

现在我这样做:

print('\033[0;41;97m')
logger.info('Colored message')
print('\033[0m')

这样可以正常工作,但问题是消息上面和下面都有空行。我不能这样做:

print('\033[0;41;97m', end='')
logger.info('Colored message')
print('\033[0m')

因为这样的话,消息下面会有一个空行。而我也不能这样做:

logger.info('\033[0;41;97m' + 'Colored message' + '\033[0m')

因为这样的话,当我打开日志文件时,会看到一些奇怪的符号。有没有什么解决办法呢?

编辑

ch = logging.StreamHandler()
fh = logging.handlers.RotatingFileHandler(log_file, 'a', max_bytes, 10)

ch_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
                                 '%(message)s',
                                 datefmt='%Y.%m.%d_%H:%M:%S_%Z')
fh_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
                                 '%(message)s',
                                 datefmt='%Y.%m.%d_%H:%M:%S_%Z')
ch.setFormatter(ch_formatter)
fh.setFormatter(fh_formatter)

logger.addHandler(ch)
logger.addHandler(fh)

1 个回答

4

更新

原作者提到我正在使用 RotatingFileHandler。:)

定义一个新的 FileHandler,它可以处理 ansi color 的转义。

# file handler for **ansi_escape**
class MyFileHandler(logging.handlers.RotatingFileHandler):
    import re
    ansi_escape = re.compile(r'\x1b[^m]*m')
    def emit(self, record):
        record.msg = self.ansi_escape.sub('', record.msg)
        logging.handlers.RotatingFileHandler.emit(self, record)

然后把这个和 StreamHandler 加到 logger 里。

ch = logging.StreamHandler()
fh = MyFileHandler('file.log')

ch_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
                                 '%(message)s',
                                 datefmt='%Y.%m.%d_%H:%M:%S_%Z')
fh_formatter = logging.Formatter('%(asctime)s - %(levelname)-4s - '
                                 '%(message)s',
                                 datefmt='%Y.%m.%d_%H:%M:%S_%Z')


ch.setFormatter(ch_formatter)
fh.setFormatter(fh_formatter)
logger.addHandler(ch)
logger.addHandler(fh)

定义 infoc... 具体内容见下面:

logger.infoc = lambda msg: logger.info('\033[0;41;97m' + msg + '\033[0m')

最后你可以归档...

# for colored console but not file
logger.infoc('Colored message')
# for normal
logger.info('Normal message')

编辑

那用 wrapper 来处理 彩色信息怎么样。

logger.infoc = lambda msg: logger.info('\033[0;41;97m' + msg + '\033[0m')
logger.infoc('Colored message')

使用 basicConfig 如下:

fmt = '\033[0;41;97m %(message)s \033[0m'
logging.basicConfig(level=logging.DEBUG, format=fmt)
logger = logging.getLogger(__file__)
logger.info('hello')

或者

console = logging.StreamHandler()
console.setFormatter(logging.Formatter(fmt))
logger.addHandler(console)

logger.error('hello')

更新

颜色代码应该只在 StreamHandler 中。把 FileHandler 修改成这样:

fileh = logging.FileHandler('file.log')
fileh.setFormatter(logging.Formatter('%(message)s')) # remove the color code.
logger.addHandler(fileh)

这样你的日志文件里就不会有奇怪的符号了。

撰写回答