【问题标题】:Python logger formatting is not formatting the stringPython 记录器格式化不格式化字符串
【发布时间】:2015-09-18 17:25:32
【问题描述】:

以下是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 的原因。 if 块的原因在这个answer 中提到。没有它,我会打印出重复的日志消息。

【问题讨论】:

    标签: python python-2.7 logging


    【解决方案1】:

    根记录器也在发出消息。停止传播到根:

    log.propagate = False
    

    如果您想格式化 所有 日志输出(因此消息会传播到记录器),请设置根记录器的格式化程序。

    您可以通过 logging.basicConfig() 调用来执行此操作,前提是尚未将任何内容发送到记录器,或者循环遍历根记录器的 logger.handlers 列表;如果您愿意,可以选择任何StreamHandlers

    root_logger = logging.getLogger()  # no name
    for handler in root_logger.handlers:
        if isinstance(handler, logging.Streamhandler):
            handler.setFormatter(formatter)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-28
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多