无法在python

时间:2018-03-16 05:21:11

标签: python logging

如python' logging cookbook中所述,我想在控制台上显示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的相同日志记录级别?

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

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

1 个答案:

答案 0 :(得分:2)

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

  

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

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

就像您对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)吗?如果不这样做,那么您将获得文件和控制台的相同级别。请检查并告诉我。希望这有帮助!