2013-02-19 130 views
0

我有一个Flask web应用程序,Python日志配置是在应用程序启动时通过dictConfig完成的。用于将特定日志写入数据库的处理程序附加到记录器'test.module'只有在应用程序启动时也调用logging.basicConfig(level=logging.DEBUG)时,对该记录器所做的日志才写入数据库。否则,不会将日志写入数据库。我知道basicConfig只是将一个streamHandler附加到根记录器。我认为这应该是无关紧要的,因为我不希望root logger做任何事情。为什么没有basicConfig这不起作用?没有basicConfig的日志处理程序无法正常工作

我添加了如何在下面启动记录器和我的配置。

class DbHandler(logging.Handler): 
    def __init__(self, level=logging.NOTSET): 
     logging.Handler.__init__(self, level) 

    def emit(self, record): 
     record.message = self.format(record) 
     log = DbModel() 
     log.message = record.message 
     log.save() 


LOGGING = { 
    'version': 1, 
    'handlers': { 
     'db_log': { 
      'level': 'DEBUG', 
      'class': 'test.handlers.DbHandler', 
     }, 
    }, 
    'loggers': { 
     'test.important_module': { 
      'handlers': [ 
       'db_log' 
      ], 
    }, 
} 

# logging.basicConfig(level=logging.DEBUG) # Doesnt work without this 
logging.config.dictConfig(LOGGING) 

logger = logging.getLogger('test.important_module') 
logger.info('Making a test') 
+0

你能使用的是设置记录器,以及如何,涉及到的代码进行实际记录的代码?目前为止你提供的内容有些模糊...... – isedev 2013-02-19 13:39:32

+0

@isedev我现在加了它 – refik 2013-02-19 13:53:44

+1

仅仅从可用性的角度来看,我会重新考虑修改'record.message'作为副作用。只需直接设置'log.message = self.format(record)'。 – 2013-02-19 14:06:50

回答

3

你是不是设置了“test.important_module”记录器本身的水平(只设置了处理程序的级别)。

你可以这样说:

logger = logging.getLogger('test.important_module') 
logger.setLevel(logging.DEBUG) 

或者这样:

'loggers': { 
    'test.important_module': { 
     'level': 'DEBUG',   # <<< HERE 
     'handlers': [ 
      'db_log' 
     ], 
}, 
+0

谢谢。只是好奇,为什么basicConfig有使其工作的副作用?它是否为所有记录器设定了等级? – refik 2013-02-19 14:10:05

+0

正如我所理解的,当我在'test.important_module'上调用logger.info时,由于记录器没有级别,所以记录没有将其记录到db_log处理程序。在调用basicConfig之后,root获取DEBUG级别。因此,现在当我在'test.important_module'上调用logger.info时,记录器仍然没有一个级别,所以记录仍然不应该将其记录到db_log处理程序。后来记录传播到根,我看到它打印在控制台上。但是这并不能解释为什么在根获得一个级别后记录被记录在数据库中。我错了吗? – refik 2013-02-19 14:48:29

+1

呃,对不起......我的坏,不知道我在想什么。我的意思是说,test.important_module有一个NOTSET级别,所以会从根记录器继承。 – isedev 2013-02-19 14:59:16