Python 3.x 日志记录getLogger不输出
我正在尝试为python模块设置日志记录机制 下面是我为设置日志而编写的示例代码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
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)
。谢谢请把它作为答案贴出来。