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

avi*_*avi 6 python logging python-2.7

以下为 的内容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
Run Code Online (Sandbox Code Playgroud)

以下是内容myscript.py

from mylogger import get_logger

_logger = get_logger()

_logger.info('trying info')
_logger.debug('trying debug')
Run Code Online (Sandbox Code Playgroud)

然而我面临两个问题。它打印日志两次并且格式化程序每次都不起作用:

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 
Run Code Online (Sandbox Code Playgroud)

我的代码到底有什么问题get_logger

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

Mar*_*ers 6

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

log.propagate = False
Run Code Online (Sandbox Code Playgroud)

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

您可以通过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)
Run Code Online (Sandbox Code Playgroud)