我正在尝试按照以下代码创建自定义记录器。但是,无论我传递给该功能的级别如何,记录器都只会打印警告消息。例如,即使我默认设置参数 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()
答案 0 :(得分:0)
需要了解的几点(有关详细信息,请阅读这些logging docs)
您已经设置了处理程序( 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
对象的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
要让记录器自行处理所需级别以上的消息,只需通过logger.setLevel(level)
函数中的get_logger
在记录器上进行设置即可。