如何使用一个格式化程序记录并使用彩色格式化程序到终端?

时间:2017-01-23 19:28:42

标签: python

我希望记录到文件以及在终端窗口中显示相同的信息,但颜色很好(使用colorlog或其他跨平台日志着色器)。这就是我所拥有的:

import logging
import os

import colorlog


def logger(log_filepath='my_app.log', logger_name='myAppLogger'):
    """Log plain text to file and to terminal with colors"""

    logger = logging.getLogger(logger_name)

    # Log to file (but not to terminal)
    logfile_handler = logging.FileHandler(log_filepath)
    plain_formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
    logfile_handler.setFormatter(plain_formatter)
    logfile_handler.setLevel(logging.DEBUG)

    # Logging info level to stdout with colors
    terminal_handler = colorlog.StreamHandler()
    color_formatter = colorlog.ColoredFormatter(
        "%(log_color)s%(levelname)-8s%(reset)s %(asctime)s %(blue)s%(message)s",
        datefmt=None,
        reset=True,
        log_colors={
            'DEBUG':    'cyan',
            'INFO':     'green',
            'WARNING':  'yellow',
            'ERROR':    'red',
            'CRITICAL': 'red,bg_white',
        },
        secondary_log_colors={},
        style='%'
    )
    terminal_handler.setLevel(logging.DEBUG)
    terminal_handler.setFormatter(color_formatter)

    # Add handlers to logger
    logger.addHandler(logfile_handler)
    logger.addHandler(terminal_handler)

    return logger


my_logger = logger()

my_logger.debug('Testing debug')
my_logger.info('Testing info')
my_logger.warning('Testing warning')
my_logger.error('Testing error')
my_logger.critical('Testing critical')

这在终端(带颜色)中给出了以下内容:

WARNING  2017-01-23 20:30:55,180 Testing warning
ERROR    2017-01-23 20:30:55,180 Testing error
CRITICAL 2017-01-23 20:30:55,181 Testing critical

...这在日志文件中(没有颜色,只是纯文本):

2017-01-23 20:30:55,180 WARNING Testing warning
2017-01-23 20:30:55,180 ERROR Testing error
2017-01-23 20:30:55,181 CRITICAL Testing critical

为什么这个级别不对?

1 个答案:

答案 0 :(得分:1)

您的(原始)代码中存在两个问题。第一个是一个小错误,您将color_formatter分配给日志处理程序而不是终端处理程序。

第二个问题 - 您未在终端中看到WARNING级以下的日志 - 是由于您在终端处理程序上设置了最低日志记录级别这一事实造成的不是记录器本身。您需要替换:

terminal_handler.setLevel(logging.DEBUG)

使用:

logger.setLevel(logging.DEBUG)

根据the documentation,记录器默认设置为WARNING日志级别,如果我的直觉正确,那么只将处理程序设置为较低的日志级别将不起作用,因为处理程序只能处理记录器无论如何都要提供它 - WARNING - 级别日志及以上。