Python:如何在python使用记录模块中创建和使用自定义记录器?

时间:2018-11-26 05:17:41

标签: python python-3.x amazon-web-services logging amazon-s3

我正在尝试按照以下代码创建自定义记录器。但是,无论我传递给该功能的级别如何,记录器都只会打印警告消息。例如,即使我默认设置参数 level = logging.DEBUG ,我的代码也无法记录调试或信息消息。有人可以在这里指出问题。

import boto3
import logging


def get_logger(name=__name__, level=logging.DEBUG):
    # Create log handler
    logHandler = logging.StreamHandler()
    logHandler.setLevel(level)

    # Set handler format
    logFormat = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%d-%b-%y")
    logHandler.setFormatter(logFormat)

    # Create logger
    logger = logging.getLogger(name)
    # Add handler to logger
    logger.addHandler(logHandler)

    # Stop propagating the log messages to root logger
    # logger.propagate = False

    return logger


def listBuckets():

    logThis = get_logger(level=logging.DEBUG)

    s3 = boto3.resource('s3')
    for bucket in s3.buckets.all():
        logThis.debug(msg='This message is from logger')
        print(bucket.name)


listBuckets()

2 个答案:

答案 0 :(得分:0)

需要了解的几点(有关详细信息,请阅读这些logging docs

  • 在评估有效日志级别时,父母/祖先的日志级别优先
  • 例如使用 getLogger 创建的root记录器,其默认日志级别为警告

您已经设置了处理程序( logHandler )的日志级别,但没有设置根目录( logger )。此时,任何处理程序的日志级别都不能低于根目录的日志级别,即 WARNING

logHandler.setLevel(level)
logger.addHandler(logHandler)
logThis.debug(msg='This message is from logger')  # Does not log
logThis.warn(msg='This message is from logger')  # Logs

因此,将根级别设置为合理的水平,您应该会很好

logHandler.setLevel('WARNING')  # or NOTSET
logThis.debug(msg='This message is from logger') # Logs!

答案 1 :(得分:0)

您会忽略以下事实:a)每个记录器的最终祖先都是 root 记录器(默认情况下具有级别WARNING)和b)记录器和处理程序都具有级别。

The docs状态:

  

创建记录器时,级别设置为NOTSET(会导致   当记录器是根记录器时要处理的消息,或者   当记录器为非根记录器时委托给父级

因此,您将使用默认级别NOTSET创建记录器和StreamHandler。您的记录器是 root 记录器的隐式后代。您使用该处理程序将处理程序设置为DEBUG级别,但未将 logger 设置为该级别。 由于记录器上的级别仍然为NOTSET,因此在发生日志事件时,将遍历其祖先链...

  

...直到找到一个非NOTSET级别的祖先,或者   到达根。

     

[...]

     

如果到达根目录,并且其级别为NOTSET,则所有   消息将被处理。否则,将使用根级别   作为有效水平

这意味着,您立即结束 root 记录器以确定有效的日志级别;根据 root 记录器的默认设置,它设置为WARNING。 您可以使用parent对象的levelgetEffectiveLevel属性以及logger方法来检查:

logThis = get_logger()
print(logThis.parent)               # <RootLogger root (WARNING)>
print(logThis.level)                # 0 (= NOTSET)
print(logThis.getEffectiveLevel())  # 30 (= WARNING) from root logger

要让记录器自行处理所需级别以上的消息,只需通过logger.setLevel(level)函数中的get_logger在记录器上进行设置即可。