如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()
为什么我看到FileHandler
和StreamHandler
的日志记录级别相同?
如何为两个同时运行的处理程序正确设置不同的日志记录级别?
编辑:在函数定义后添加了冒号
好的,回答你的第一个问题,
记录器对象具有三重作业。首先,他们暴露了几个 应用程序代码的方法,以便应用程序可以在 运行。其次,记录器对象确定要执行哪些日志消息 基于严重性(默认过滤工具)或过滤器 对象。第三,记录器对象将相关日志消息传递给所有 感兴趣的日志处理程序。
因此,在您的应用程序中,您需要将某些级别的消息记录到文件中,而某些消息显示在控制台上。因此,要做到这一点,您首先需要创建一个记录器对象,指定最低的严重性(即上面文档中提到的默认过滤工具),该严重性将被调度到适当的目标(即首先到处理程序,然后是右处理程序的目的地)。
这就像您对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)
吗?如果不这样做,那么您将获得文件和控制台的相同级别。请检查并让我知道。希望这有帮助!