2010-11-09 242 views
3

我正在编写一个服务器应用程序,该应用程序应该能够在控制台和日志文件的不同级别上进行日志记录。使用Python日志记录管理日志记录器

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

它也可以使用logging.basicConfig(filename ='logger.log')来写入文件。

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

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

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

我试图创建两个句柄,一个用于控制台,另一个用于日志文件,它们工作,但无论basicConfig()指定的日志类型是否仍然显示重复消息。

有没有办法禁用basicConfig()的输出? 或者其他方式来实现这些选项?

谢谢。

回答

4

你不会在你的问题中确切地说你想在你的控制台和文件日志上记录什么级别。但是,您不需要拨打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 

的事件被传递到记录器第一,如果一个事件要处理(由于比较记录器和事件的电平),那么该事件是传递给记录器的每个处理程序及其所有祖先的处理程序。如果在处理程序上设置了级别,则该处理程序可以删除该事件,否则它将输出该事件。