2013-02-19 133 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