Python2.7 log level of logging doesn't work
最近似乎有了一些关于python日志记录包的更改。以前的一些代码现在不起作用。我很困惑。我的python版本是python 2.7.15。
我不理解的第一个例子是,下面只打印"警告:根:来自警告的你好"。如果我理解正确,"logging.info"实际上调用根记录器,而根记录器默认为警告级别。所以第一个"信息问好"被忽略了,这很好。但是为什么第二个"信息问好"也没有打印出来呢?
1 2 3 4 5 6 | import logging logging.info("hello from info") logging.warn("hello from warn") logging.basicConfig(level=logging.INFO) logging.info("hello from info") |
第二个问题是处理程序和记录器的日志级别。如果我们为处理程序和记录器都设置了日志级别,那么哪个正在工作?或者,如果我们只是为处理程序设置级别呢?以下面的例子为例。我们已经为streamhandler设置了日志级别,但是"hello-from-info"不会打印到stdout。只有"来自警告的你好"(此外,它不是"警告:t:来自警告的你好")。为什么?
1 2 3 4 5 6 7 | import logging ch = logging.StreamHandler() ch.setLevel(logging.INFO) logger = logging.getLogger('t') logger.addHandler(ch) logger.info("hello from info") logger.warn("hello from warn") |
号
But why the second"hello from info" is also not printed?
号
因为
1 2 3 4 | def info(msg, *args, **kwargs): if len(root.handlers) == 0: basicConfig() root.info(msg, *args, **kwargs) |
如果已经配置了根记录器,那么
This function does nothing if the root logger already has handlers configured for it.
号
因此,在您的代码中,当执行
经验法则:在代码中尽早配置记录器(无论是手动还是通过
If we set the log level for both the handler and logger, which one is working?
号
都是!日志程序级别和处理程序级别是筛选记录的两个不同阶段。logger级别定义实际传递给其处理程序的记录,而handler级别定义特定处理程序将处理哪些记录。示例:
1 2 3 4 | logger.setLevel(logging.INFO) handler.setLevel(logging.ERROR) logger.addHandler(handler) logger.info('spam') |
号
由于logger具有级别
1 2 3 4 | logger.setLevel(logging.WARN) handler.setLevel(logging.DEBUG) logger.addHandler(handler) logger.info('spam') |
现在,处理程序将处理几乎所有记录,包括
1 2 3 4 5 6 7 8 | logger.setLevel(logging.INFO) h1 = logging.StreamHandler() h1.setLevel(logging.CRITICAL) h2 = logging.FileHandler('some.log') h2.setLevel(logging.DEBUG) logger.addHandler(h1) logger.addHandler(h2) logger.info('spam') |
。
现在记录器有两个处理程序,