将chromalog添加到STDOUT和文件记录

时间:2016-04-11 20:13:39

标签: python logging python-3.4

我正在使用python的内置logging模块

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger.info('information!2') # this DOES go to both STDOUT and the FILE.  but how to chromalog it???

这个设置的好处是输出打印到终端 spam.log 文件。现在我想将chromalog插入到此终端以获得颜色输出。通常我会通过上面的

来做到这一点
chromalog.basicConfig(level=logging.DEBUG, format='%(asctime)s   %(filename)s line %(lineno)d   %(levelname)s:   %(message)s', datefmt='%Y-%m-%d at %I:%M %p and %S secs')

不幸的是,我认为chromalog检测到输出转到文件并关闭颜色。如果chromalog可以为终端输出打开颜色并关闭文件输出的颜色,那将是理想的。

这可能吗?我该怎么做?附:我愿意接受chromalog的替代方案。

2 个答案:

答案 0 :(得分:1)

我认为这与INFO的默认颜色有关。这个脚本:

import logging

import chromalog

logger = logging.getLogger('foo')

chromalog.basicConfig(level=logging.DEBUG, format='%(asctime)s %(message)s')
fh = logging.FileHandler('foo.log')
logger.addHandler(fh)
logger.warning('warning!')

提供彩色输出:

enter image description here

日志文件包含未着色的输出:

$ cat foo.log
warning!

答案 1 :(得分:0)

这是一个使用colorlog而不是chromalog的解决方案:

import logging
import colorlog

FORMAT_TEMPLATE = '%(asctime)s  %(filename)s line %(lineno)d  {}%(levelname)s{}: {}%(message)s'
FORMAT = FORMAT_TEMPLATE.format()
FORMAT_COLOR = FORMAT_TEMPLATE.format('%(log_color)s', '%(reset)s', '%(message_log_color)s')

logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG) # if you want to see more than just warnings, remember this!!  You can also set this option to a HANDLER if you want that handler to be at a different level.

# create an output to the terminal:
stdout_handler = logging.StreamHandler()
stdout_handler.setFormatter(
    colorlog.ColoredFormatter(
        FORMAT_COLOR,
        log_colors={
            'DEBUG':    'cyan',
            'INFO':     'green',
            'WARNING':  'yellow',
            'ERROR':    'red',
            'CRITICAL': 'red,bg_white',
        },
    )
)
logger.addHandler(stdout_handler)

# create an output to a file:
fh = logging.FileHandler('mylog.log')
fh.setFormatter(
    logging.Formatter(
        FORMAT,
    )
)
logger.addHandler(fh)

# ready to use!:
logger.debug('hi-ho!')

这里我们为我们想要的每个输出创建一个 Handler 。这样可以提供更多控制,并且可以为每个输出使用不同的格式选项。