2012-11-21 53 views
1

我們正在爲其設置日誌系統的python程序/庫工作。基本上我們想要在一個文件上登錄終端。爲此,我們將使用標準分發中嵌入的優秀日誌記錄軟件包。python日誌檢索特定處理程序

日誌級別應該由用戶通過其首選項進行自定義。我的問題是如何檢索連接到記錄器的處理程序之一?我在想的東西有點像這樣:

import logging 

class NullHandler(logging.Handler): 
    def emit(self,record): 
     pass 

HANDLERS = {} 
HANDLERS['console'] = logging.StreamHandler() 
HANDLERS['logfile'] = logging.FileHandler('test.log','w') 

logging.getLogger().addHandler(NullHandler()) 
logging.getLogger('console').addHandler(HANDLERS['console']) 
logging.getLogger('logfile').addHandler(HANDLERS['logfile']) 

def set_log_level(handler, level): 
    if hanlder not in HANDLERS: 
     return 

    HANDLERS[handler].setLevel(level) 

def log(message, level, logger=None): 

    if logger is None: 
     logger= HANDLERS.keys() 

    for l in logger: 
     logging.getLogger(l).log(level, message) 

正如你看到的,我的實現意味着使用該處理器的全球字典來存儲我創建的處理程序的實例。我找不到更好的方法來做到這一點。在這種設計中,可以這樣說,因爲我只是在每個記錄器中插入一個處理程序,所以我的記錄器對象的處理程序屬性應該可以,但是我正在尋找更一般的東西(例如,如果有一天某個處理程序被插入,怎麼辦我的記錄器之一?)

您對此有何看法?

非常感謝你

埃裏克

回答

0

您不僅可以設置處理器的水平,但也有記錄的:

import logging 
class NullHandler(logging.Handler): 
    def emit(self,record): 
     pass 

logging.getLogger().addHandler(NullHandler()) 
logging.getLogger('console').addHandler(logging.StreamHandler()) 

logging.getLogger('console').info("foo") 
logging.getLogger('console').setLevel(1000) 
logging.getLogger('console').info("foo") 
logging.getLogger('console').setLevel(1) 
logging.getLogger('console').info("foo") 

注意,處理程序的日誌級別是獨立的這個一個和一個處理程序只會記錄如果兩個級別都達到。

相關問題