无法为 python 中的两个日志记录处理程序设置不同的日志记录级别



如python的日志记录手册中所述,我想在控制台上显示logging.INFO,同时将logging.WARNING写入日志文件。

但是,使用此代码时,我在控制台和日志文件中看到logging.INFO

import logging
def initialize_logger():
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)         # <--- ADDING THIS LINE SOLVED IT
fh = logging.FileHandler('error.log') # create file handler which logs WARNING
fh.setLevel(logging.WARNING)
ch = logging.StreamHandler()          # create console handler which logs INFO
ch.setLevel(logging.INFO)
formatter = logging.Formatter('%(name)s - %(message)s') # create formatter
ch.setFormatter(formatter)            # add formatter to handlers
fh.setFormatter(formatter)            # add formatter to handlers
logger.addHandler(ch)                 # add the handlers to logger
logger.addHandler(fh)                 # add the handlers to logger
return logger
logger = initialize_logger()

为什么我看到FileHandlerStreamHandler的日志记录级别相同?

如何为两个同时运行的处理程序正确设置不同的日志记录级别?


编辑:在函数定义后添加了冒号

好的,回答你的第一个问题,

记录器对象具有三重作业。首先,他们暴露了几个 应用程序代码的方法,以便应用程序可以在 运行。其次,记录器对象确定要执行哪些日志消息 基于严重性(默认过滤工具)或过滤器 对象。第三,记录器对象将相关日志消息传递给所有 感兴趣的日志处理程序。

因此,在您的应用程序中,您需要将某些级别的消息记录到文件中,而某些消息显示在控制台上。因此,要做到这一点,您首先需要创建一个记录器对象,指定最低的严重性(即上面文档中提到的默认过滤工具),该严重性将被调度到适当的目标(即首先到处理程序,然后是右处理程序的目的地)。

这就像您对logger对象说,您的handlers将仅处理高于此级别的日志消息。如果您未指定它,或者您指定了处理程序将要调度的级别,则可能不会将该日志消息调度到处理程序,因为logger对象首先没有收到它。有意义?

因此,这意味着如果您要使用handlers,您需要先setLevel()logger,因为这是日志消息调度到的初始过滤器/点。后来,logger将其发送到各自的handlers

对于你的下一个问题,

我在底部添加以下行后运行了您的代码:

logger.debug('Quick zephyrs blow, vexing daft Jim.')
logger.info('How quickly daft jumping zebras vex.')
logger.warning('Jail zesty vixen who grabbed pay from quack.')
logger.error('The five boxing wizards jump quickly.')

我在我的控制台中获得了最后三个(来自logger.info()),最后两个(来自logger.warning())在我的文件中temp/error.log.这是预期的正确行为。所以我在这里没有得到错误。

您确定要在开头添加logger.setLevel(logging.INFO)吗?如果不这样做,那么您将获得文件和控制台的相同级别。请检查并让我知道。希望这有帮助!

最新更新