首页 > 解决方案 > 记录 getLogger 不输出

问题描述

我正在尝试为 python 模块设置日志记录机制。

以下是我为设置日志记录而编写的示例代码

import logging

def init_logger(logger):
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(message)s')
    ch = logging.StreamHandler()
    ch.setFormatter(formatter)
    ch.setLevel(logging.INFO)
    logger.addHandler(ch)

    file_handler = logging.FileHandler('test_logging.log')
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.DEBUG)
    logger.addHandler(file_handler)

def foo1():
    logger = logging.getLogger(__name__)

    logger.info('Test Info')
    logger.debug('Test Debug')
    logger.error('Test Error')


def foo2():
    logger = logging.getLogger(__name__)

    logger.info('Test Info')
    logger.debug('Test Debug')
    logger.error('Test Error')


if __name__ == '__main__':
    logger = logging.getLogger(__name__)
    init_logger(logger)
    foo1()
    foo2()

我希望日志将信息级别及以上打印到标准输出和调试级别及以上以写入日志文件。但我看到的是只有错误级别输出到标准输出和日志文件。

2019-08-13 11:20:07,775 - ERROR - test_logger.py - foo1 - Test Error
2019-08-13 11:20:07,776 - ERROR - test_logger.py - foo2 - Test Error

根据文档 getLogger应该返回相同的记录器实例。我什至第一次尝试创建一个新实例,logger = logging.Logger(__name__)但没有运气。我不明白我在这里错过了什么。

标签: python-3.x

解决方案


简短回答:您必须在代码中使用logging.basicConfig(level=...)or logger.setLevel

当您logging.getLogger('some_name')第一次使用时,您使用level = NOTSET = 0.

# logging module source code
class Logger(Filterer):
    def __init__(self, name, level=NOTSET):
        ...

logging.NOTSET似乎是一个有效的水平值,但它不是。实际上,它是非法值,表示未启用记录器来记录任何内容并强制记录器使用父记录器(根记录器)的级别。此逻辑在Looger.getEffectiveLevel方法中定义:

# logging module source code
def getEffectiveLevel(self):
    logger = self
    while logger:
        if logger.level:  # 0 gives False here
            return logger.level
        logger = logger.parent  # 0 makes this line reachable
    return NOTSET

根记录器有level=WARNING新创建的记录器继承这个级别:

# logging module source code
root = RootLogger(WARNING)

logging.getLogger不允许您指定日志记录级别。因此,您必须使用logging.basicConfig修改根记录器或logger.setLevel在脚本开头的某处修改新创建的记录器。

我想该功能应该记录在日志模块指南/文档中。


推荐阅读