Python 3.x 日志记录getLogger不输出

Python 3.x 日志记录getLogger不输出,python-3.x,Python 3.x,我正在尝试为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(format

我正在尝试为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实例。我甚至第一次尝试创建一个新实例,比如
logger=logging.logger(\uuu name\uuuu)
,但没有成功。我不明白我在这里遗漏了什么。

简短回答:您必须在代码中使用
logging.basicConfig(level=…)
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)
日志记录。getLogger
不允许您指定日志记录级别。因此,您必须使用
logging.basicConfig
来修改根记录器,或者使用
logger.setLevel
来修改脚本开头的某个地方新创建的记录器


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

因此,您建议我需要设置
basicConfig(level=logging.INFO)
?我想您需要
logger.setLevel(logging.DEBUG)
。否则,您将从根记录器获得级别
警告
,因为初始级别值为0(未设置),这也是
错误
,因此根据
日志记录
模块逻辑-函数
getEffectiveLevel
定义逻辑,它是非法值。因此,您不能使用
getLogger
初始化级别,必须使用
logger.setLevel
logging.basicConfig
。我想应该记录该功能,但事实并非如此。在
init\u logger
之前,将级别设置为
logger.setLevel(logging.DEBUG)
。谢谢请把它作为答案贴出来。