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)
您错过了一个事实:a)每个记录器的最终祖先都是根记录器(WARNING默认情况下具有级别)和 b)记录器和处理程序都具有级别。
文档状态:
创建记录器时,级别设置为 NOTSET(当记录器是根记录器时,这会导致处理所有消息,或者 当记录器是非根记录器时将其委托给父记录器)。
因此,您创建了一个 logger 和一个 StreamHandler ,它们的默认 level NOTSET。您的记录器是根记录器的隐式后代。您将处理程序设置为 level DEBUG,但不是使用该处理程序的记录器。由于记录器上的级别仍然是NOTSET,因此当发生日志事件时,将遍历其祖先链......
...直到找到级别不是 NOTSET 的祖先,或者到达根。
[...]
如果到达根,并且它的级别为 NOTSET,则将处理所有消息。否则,根的级别将用作有效级别。
这意味着,您会立即在根记录器处确定有效的日志级别;它被设置WARNING为根记录器的默认值。您可以使用对象上的parent和level属性和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函数中将其设置在记录器上即可。
需要了解的几点(有关详细信息,请阅读这些日志记录文档)
您已设置处理程序 ( 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)
| 归档时间: |
|
| 查看次数: |
4141 次 |
| 最近记录: |