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

exa*_*xan 5 python logging amazon-s3 amazon-web-services python-3.x

我正在尝试创建一个自定义记录器,如下面的代码所示。但是,无论我传递给函数的级别是什么,logger 都只会打印警告消息。例如,即使我默认设置参数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()
Run Code Online (Sandbox Code Playgroud)

shm*_*mee 6

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

文档状态:

创建记录器时,级别设置为 NOTSET(当记录器是根记录器时,这会导致处理所有消息,或者 当记录器是非根记录器时将其委托给父记录器)。

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

...直到找到级别不是 NOTSET 的祖先,或者到达根。

[...]

如果到达根,并且它的级别为 NOTSET,则将处理所有消息。否则,根的级别将用作有效级别

这意味着,您会立即在记录器处确定有效的日志级别;它被设置WARNING记录器的默认值。您可以使用对象上的parentlevel属性和getEffectiveLevel方法进行检查logger

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

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


roh*_*was 1

需要了解的几点(有关详细信息,请阅读这些日志记录文档)

  • 在评估有效日志级别时,父级/祖先的日志级别优先
  • 根记录器(例如使用getLogger创建的根记录器)将WARNING作为默认日志级别

您已设置处理程序 ( 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
Run Code Online (Sandbox Code Playgroud)

因此,将根级别设置为合理的值就可以开始了

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