正在忽略记录setLevel

时间:2017-03-30 05:35:30

标签: python logging

以下代码是从文档中复制的。我应该能够看到所有的信息日志。但我没有。即使我已将setLevel设置为INFO,我也只能看到警告及以上。

为什么会这样? foo.py

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

输出:

workingDirectory$ python foo.py
warn message
error message
critical message

信息和调试消息在哪里?

7 个答案:

答案 0 :(得分:16)

尝试在那里运行logging.basicConfig()。值得注意的是,我看到你提到INFO,但是使用DEBUG。如上所述,它应该显示所有五条消息。用INFO交换DEBUG,你应该看到四条消息。

@RunWith(PowerMockRunner.class)
@PrepareForTest({AwsConfigurationLocal.class})//assuming this is your test class

@InjectMocks
private AwsConfigurationLocal subject=PowerMockito.spy(AwsConfigurationLocal.class);//or try Mockito.spy instead, whichever works

@Test
    public void TestgetAllSecurityGroups() throws Exception {

        ec2 = Mockito.mock(AmazonEC2Client.class);
        PowerMockito.doReturn(ec2).when(subject).configSetter().withNoArguments();
        //your code
    }

编辑:您是否已在代码中的其他位置设置了日志记录?无法使用提供的特定代码重现您注意到的确切行为。

答案 1 :(得分:14)

替换

logger.setLevel(logging.DEBUG)

logging.basicConfig(level=logging.DEBUG, format='%(message)s')

它应该按预期工作。如果您没有使用任何处理程序配置日志记录(如在帖子中 - 您只为记录器配置级别,但在任何地方都没有处理程序),那么您将获得一个内部处理程序"of last resort"仅在WARNING级别输出消息(没有其他格式)。

答案 2 :(得分:11)

某些用户指出,使用:

logging.basicConfig(level=logging.DEBUG, format='%(message)s')

那样写在接受的软件中不是一个好选择,因为它全局设置了日志级别,因此它将记录来自每个记录器的调试消息。

就我而言,仅为记录器设置日志级别的最佳解决方案是:

import logging

logger = logging.getLogger('MyLogger')
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

这不是真正直观的解决方案,但是如果您只想为“ MyLogger”设置日志级别而不是全局设置,则必须这样做。

答案 3 :(得分:1)

您必须将根记录器的basicConfig设置为DEBUG,然后才能将各个记录器的级别设置为更严格的级别。

这不是我所期望的。这是我必须要做的:

#!/usr/bin/env python3

import logging
# by default this is WARNING.  Leaving it as WARNING here overrides 
# whatever setLevel-ing you do later so it seems they are ignored.
logging.basicConfig(level=logging.DEBUG)

l = logging.getLogger(__name__)
l.setLevel(level=logging.INFO)
# if I hadn't called basicConfig with DEBUG level earlier, 
# info messages would STILL not be shown despite calling 
# setLevel above.  However now debug messages will not be shown 
# for l because setLevel set it to INFO

l.warning('A warning message will be displayed')
l.info('A friendly info message will be displayed')
l.debug('A friendly debug message will not be displayed')

答案 4 :(得分:0)

从技术上讲,这也是一个“答案”,因为它可以“解决”问题。但是我绝对不喜欢它。这不直观,我为此损失了2个多小时。

之前:

import logging
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info('You can not see me')
# Or you can just use the following one-liner in command line.
# $ python -c "import logging; logger = logging.getLogger('foo'); logger.setLevel(logging.INFO); logger.info('You can not see me')"

之后:

import logging

logging.debug('invisible magic')  # <-- magic

logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
logger.info('But now you can see me')
# Or you can just use the following one-liner in command line.
$ python -c "import logging; logging.debug('invisible magic'); logger = logging.getLogger('foo'); logger.setLevel(logging.INFO); logger.info('But now you see me')"

PS:将其与当前选择的答案进行比较,再加上@ Vinay-Sajip的解释,我可以理解为什么。但我还是希望它不会那样工作。

答案 5 :(得分:0)

在Win10,Python 3.7.2上,接受的答案对我不起作用。

我的解决方案:

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

它对订单敏感。

答案 6 :(得分:0)

如果你想让它在没有 basicConfig 的情况下工作,你必须首先设置你将登录到记录器的最低级别。由于记录器设置了最小阈值,具有较低阈值但属于同一记录器的处理程序将不会收到那些阈值较低的消息,因为它们首先被记录器忽略。直观,但不明显。

我们从这样做开始:

lgr = logging.getLogger(name)
lgr.setLevel(logging.DEBUG)

然后,使用您需要的不同级别设置处理程序,在我的情况下,我希望在标准输出上进行调试日志记录并将信息记录到旋转文件中,因此我执行以下操作:

rot_hndlr = RotatingFileHandler('filename.log',
                                maxBytes=log_size,
                                backupCount=3)
    
rot_hndlr.setFormatter(formatter)
rot_hndlr.setLevel(logging.INFO)
lgr.addHandler(rot_hndlr)

stream_hndlr = logging.StreamHandler()
stream_hndlr.setFormatter(stream_formatter)
lgr.addHandler(stream_hndlr)

然后,为了测试,我这样做:

lgr.debug("Hello")
lgr.info("There")

我的标准输出(控制台)如下所示:

Hello
There

我的 filename.log 文件将如下所示:

There