Python日志记录模块打印不必要的消

时间:2017-03-03 15:26:44

标签: python logging

请考虑这个虚拟代码。

$ cat dummy.py 
import logging
import time

from boto3.session import Session

# Logging Configuration
fmt = '%(asctime)s [%(levelname)s] [%(module)s] - %(message)s'
logging.basicConfig(level='INFO', format=fmt, datefmt='%m/%d/%Y %I:%M:%S')
logger = logging.getLogger()

def main():
    session = Session(region_name='us-west-2')
    client = session.client('ec2')
    response = client.describe_instances(InstanceIds=['i-11111111111111111'])

    logger.info('The instnace size is: %s', response[
                'Reservations'][0]['Instances'][0]['InstanceType'])

if __name__ == '__main__':
    main()

输出:

$ python3 dummy.py 
03/03/2017 08:47:00 [INFO] [credentials] - Found credentials in shared credentials file: ~/.aws/credentials
03/03/2017 08:47:01 [INFO] [connectionpool] - Starting new HTTPS connection (1): ec2.us-west-2.amazonaws.com
03/03/2017 08:47:02 [INFO] [dummy] - The instnace size is: t2.micro

问题: 如何避免下面的线被打印?

03/03/2017 08:47:00 [INFO] [credentials] - Found credentials in shared credentials file: ~/.aws/credentials
03/03/2017 08:47:01 [INFO] [connectionpool] - Starting new HTTPS connection (1): ec2.us-west-2.amazonaws.com

如果我将logging.basicConfig(level='INFO',...更改为logging.basicConfig(level='WARNING',...,则不会打印这些消息,但会以WARNING严重性记录所有消息。

我只希望logging模块打印我使用logger.info ....明确写入的消息,而不是其他任何内容。因此,我需要有关如何避免打印不必要的消息的任何指示。

1 个答案:

答案 0 :(得分:0)

<强>解决方案:

import logging
import time

from boto3.session import Session

# Logging Configuration
fmt = '%(asctime)s [%(levelname)s] [%(module)s] - %(message)s'
logging.basicConfig(format=fmt, datefmt='%m/%d/%Y %I:%M:%S')
logger = logging.getLogger('LUCIFER')
logger.setLevel(logging.INFO)


def main():
    COUNTER = 3
    session = Session(region_name='us-west-2')
    client = session.client('ec2')
    response = client.describe_instances(InstanceIds=['i-0a912622af142b510'])

    logger.info('The instnace size is: %s', response[
                'Reservations'][0]['Instances'][0]['InstanceType'])

if __name__ == '__main__':
    main()

<强>输出:

$ python3 dummy.py 
03/03/2017 10:30:15 [INFO] [dummy] - The instnace size is: t2.micro

<强>说明: 之前,我在根记录器上设置了INFO级别。因此,所有其他没有水平集的记录器都会获得此级别propagated并开始记录。在解决方案中,我专门在记录器LUCIFER上启用此级别。

<强>参考: 来自:https://docs.python.org/3/howto/logging.html

子记录器将消息传播到与其祖先记录器关联的处理程序。因此,不必为应用程序使用的所有记录器定义和配置处理程序。为顶级记录器配置处理程序并根据需要创建子记录器就足够了。 (但是,您可以通过将记录器的传播属性设置为False来关闭传播。)

除了与记录器直接关联的任何处理程序之外,还会调用与记录器的所有祖先关联的所有处理程序来分派消息(除非记录器的传播标志设置为false值,此时传递给祖先处理程序停止)。