我按如下方式设置了日志记录:
def setUp():
LOG_FORMAT = '%(asctime)s %(levelname)-8s %(name)s %(message)s'
#LOG_FORMAT = '%(asctime)s %(name)s %(message)s'
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
formatter = logging.Formatter(LOG_FORMAT)
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
ch.setFormatter(formatter)
logging.getLogger().addHandler(ch)
LOG_FILENAME = 'file.log'
fh = logging.FileHandler(LOG_FILENAME, 'w')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logging.getLogger().addHandler(fh)
但是,控制台仍会显示DEBUG
条消息。我在这里错过了什么吗?
请注意,在ERROR
上将级别设置为fh
可以正常工作。
答案 0 :(得分:2)
我认为您需要删除对logging.basicConfig
的调用。该函数添加了另一个logging.StreamHandler
,可能是打印您不想打印的邮件的那个。{/ p>
要检查这一点,您可以查看根记录器的handlers
属性(它是包含所有处理程序的列表)并验证其中有多少logging.StreamHandlers
。此外,由于两个logging.ERROR
s,水平设置为logging.StreamHandler
的消息可能会打印两次。
如果你要在代码中明确配置处理程序,我的最后建议是避免使用logging.basicConfig
。
编辑:为了完整起见,logging.BasicConfig
的源代码如下:
if len(root.handlers) == 0:
filename = kwargs.get("filename")
if filename:
mode = kwargs.get("filemode", 'a')
hdlr = FileHandler(filename, mode)
else:
stream = kwargs.get("stream")
hdlr = StreamHandler(stream)
fs = kwargs.get("format", BASIC_FORMAT)
dfs = kwargs.get("datefmt", None)
fmt = Formatter(fs, dfs)
hdlr.setFormatter(fmt)
root.addHandler(hdlr)
level = kwargs.get("level")
if level is not None:
root.setLevel(level)
您可以看到,除非filename
通过,否则会创建logging.StreamHandler
。
答案 1 :(得分:2)
来自logging.basicConfig上的Python文档:
通过创建日志记录系统的基本配置 StreamHandler使用默认格式化程序并将其添加到根目录 记录器。
当您将根记录器的调试级别设置为logging.DEBUG
并且您没有关闭转发消息到根记录器时,您的DEBUG消息会被basicConfig
创建的此StreamHandler记录