【问题标题】:How to decorate console logger messages in Python?如何在 Python 中装饰控制台记录器消息?
【发布时间】:2014-06-08 01:19:21
【问题描述】:

我在 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)

【问题讨论】:

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


    【解决方案1】:

    更新

    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)
    

    您的日志文件中不再有奇怪的符号。

    【讨论】:

    • 但是,如果我只想对一些消息而不是全部消息着色怎么办?
    • 消息是如何确定的?装饰与否。
    • 我简化了问题以使其更易于阅读,但实际上我需要显示一些颜色和效果截然不同的消息。如果我指定 format=fmt,每条消息都会以颜色显示,但总是相同的颜色,不是吗?
    • 我明白你在做什么,这是个好主意,因为这样我的日志文件中就没有你说的奇怪符号了。但问题是控制台格式化程序总是相同的(相同的背景,每个控制台消息的文本颜色)。我只需要在几条消息中应用颜色。
    • 太棒了!该解决方案有效!非常感谢您的友好和耐心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多