如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()
为什么我会看到FileHandler
和StreamHandler
的相同日志记录级别?
如何为两个同时运行的处理程序正确设置不同的日志记录级别?
编辑:在函数定义后添加冒号
答案 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)
吗?如果不这样做,那么您将获得文件和控制台的相同级别。请检查并告诉我。希望这有帮助!