如何在Python中装饰控制台记录器消息?

时间:2014-04-23 09:35:53

标签: python logging python-3.x colors console

我在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 个答案:

答案 0 :(得分:3)

<强>更新

OP说我正在使用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)

日志文件中没有更奇怪的符号。