Python记录器格式化不格式化字符串

时间:2015-09-18 17:25:32

标签: python python-2.7 logging

以下是mylogger.py的内容:

def get_logger(name='my_super_logger'):
    log = logging.getLogger(name)
    log.setLevel(logging.DEBUG)
    formatter = logging.Formatter(fmt='%(asctime)s %(name)s %(message)s',
                                  datefmt='%m/%d/%Y %I:%M:%S %p')
    if not len(log.handlers):
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(formatter)
        log.addHandler(ch)
    # print(id(log))
    return log

以下是myscript.py的内容:

from mylogger import get_logger

_logger = get_logger()

_logger.info('trying info')
_logger.debug('trying debug')

但是我面临两个问题。它打印日志两次,格式化程序不能每次都工作:

09/18/2015 09:59:54 PM my_super_logger trying info 
INFO:my_super_logger:trying info 
09/18/2015 09:59:54 PM my_super_logger trying debug 
DEBUG:my_super_logger:trying debug 

我的get_logger代码究竟出现了什么问题?

我需要自定义格式。但是我发现如果不添加处理程序,我就无法添加formatter。这就是我添加StreamHandler的原因。此answer中提到了if阻止的原因。没有它,我会打印重复的日志消息。

1 个答案:

答案 0 :(得分:2)

根记录器也在发出消息。使用以下命令停止传播到根目录:

function slideHandler (event, ui){
    $('#lower-cut-off').val( ui.values[0] + "%");
}

$( "#slider" ).slider({
    min : 0,
    max : 100,
    values : [ 20 , 80],
    slideLower : slideHandler,
    slide: slideHandler
}); 

如果要格式化所有日志输出(以便将消息传播到记录器),请设置根记录器的格式化程序。

您可以通过logging.basicConfig()调用来执行此操作,前提是还没有任何内容发送到记录器,或者循环遍历根记录器的log.propagate = False 列表;如果您愿意,可以挑选任何logger.handlers

StreamHandlers