一尘不染

使用Python日志记录管理记录器

python

我正在编写一个服务器应用程序,该应用程序应该能够在控制台和日志文件上以不同级别登录。

问题是,如果设置了logging.basicConfig(),它将登录到控制台,但是必须在主线程中进行设置。

也可以使用logging.basicConfig(filename =’logger.log’)进行设置以写入文件。

设置用于控制台日志记录(logging.StreamHandler())或文件日志记录(logging.FileHandler())的句柄将补充logging.baseconfig()选项集。

问题是设置不是独立的。我的意思是,logging.baseConfig()的日志级别必须包括处理程序级别,否则它将不会被记录。

因此,如果我将baseConfig设置为登录到文件,将StreamHandler设置为登录到控制台,则文件日志级别必须低于控制台级别。(此外,basicConfig选项还记录所有其他日志。)

我尝试创建两个句柄,一个用于控制台,一个用于日志文件,它们可以工作,但是basicConfig()指定的任何日志类型仍将显示重复消息。

有没有办法禁用basicConfig()的输出?还是通过其他方式实现这些选项?

谢谢。


阅读 196

收藏
2021-01-20

共1个答案

一尘不染

您没有在问题中说出您想要在控制台和文件记录上指定什么级别。但是,您不需要调用basicConfig(),因为它只是一个便捷功能。您可以执行例如(输入的代码未经测试):

import logging

logger = logging.getLogger(__name__)
configured = False

def configure_logging():
    global configured
    if not configured:
        logger.setLevel(logging.DEBUG) # or whatever
        console = logging.StreamHandler()
        file = logging.FileHandler('/path/to/file')
        #set a level on the handlers if you want;
        #if you do, they will only output events that are >= that level
        logger.addHandler(console)
        logger.addHandler(file)
        configured = True

首先将事件传递给记录器,如果要处理事件(由于比较记录器和事件的级别),则将事件传递给记录器的每个处理程序以及所有其祖先的处理程序。如果在处理程序上设置了级别,则该处理程序可能会丢弃该事件,否则它将输出该事件。

2021-01-20