如 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()
Run Code Online (Sandbox Code Playgroud)
为什么我看到了相同的日志记录级别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.')
Run Code Online (Sandbox Code Playgroud)
我logger.info()在我的控制台中获得了最后三个(来自),logger.warning()在我的文件中获得了最后两个(来自)temp/error.log。这是预期的正确行为。所以我在这里没有收到错误。
您确定要logger.setLevel(logging.INFO)在开头添加吗?如果不这样做,那么文件和控制台将获得相同的级别。请检查并告诉我。希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |