2013-11-27 104 views
4

我想使用ContextFiltering將一個用戶定義的變量添加到記錄器格式。我的代碼如下:Python日誌記錄處理程序

import logging 
import logging.handlers 
CMDID='TEST' 

class ContextFilter(logging.Filter): 
    def filter(self,record): 
    record.CMDID=CMDID 
    return True 

FORMAT='%(asctime)s [%(CMDID)s] - %(message)s' 
logger=logging.getLogger("Test") 
fh=logger.handlers.RotatingFileHandler("testing.log",maxBytes=1024,backupCount=5) 
fh.setlevel(logging.DEBUG) 
fh.setFormatter(logging.Formatter(FORMAT)) 
logger.addHandler(fh) 
logger.addFilter(ContextFilter()) 
logger.warning("WTH") 

當我不使用的FileHandler,只是使用basicConfig格式化然後代碼工作正常。但在加入了旋轉的文件處理程序,收到錯誤

Traceback (most recent call last): 
Line 16, in <module> 
fh=logger.handlers.RotatingFileHandler("testing.log",maxBytes=1024,backupCount=5) 
AttributeError: 'list' object has no attribute 'RotatingFileHandler' 

現在我自己也嘗試使用LoggerAdapters類這一點,但它也拋出一個關於進一步調查我發現,可能有一些問題,它的文檔奇怪的錯誤。

任何人都可以幫我解決這個問題,並建議我使用這個FileHandler在我的記錄器中有效地添加上下文用戶定義信息的方法。

P.S.我曾嘗試在Python文檔中給出的方法都沒用

回答

10

變化logger.handlers.logging.handlers.和錯別字提防(沒有setlevel - 方法,但setLevel - 方法)。

下面的代碼工作正常:

import logging 
import logging.handlers 
CMDID='TEST' 

class ContextFilter(logging.Filter): 
    def filter(self,record): 
    record.CMDID=CMDID 
    return True 

FORMAT='%(asctime)s [%(CMDID)s] - %(message)s' 
logger=logging.getLogger("Test") 
fh=logging.handlers.RotatingFileHandler("testing.log",maxBytes=1024,backupCount=5) 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(logging.Formatter(FORMAT)) 
logger.addHandler(fh) 
logger.addFilter(ContextFilter()) 
logger.warning("WTH") 

說明:一個記錄器實例(logger)可能有多個處理程序,通過訪問它的logger.handlers atrribute。但是,您希望首先對處理程序進行實例化(通過logging.handlers.RotatingFileHandler()),並將此處理程序(fh)與您的記錄程序(logger.addHandler)一起使用。這樣做,您的記錄器實例現在知道處理程序:

In [4]: logger.handlers 
Out[4]: [<logging.handlers.RotatingFileHandler at 0x3e85b70>] 
+1

對於錯別字,感到抱歉。 非常感謝。奇蹟般有效 !! –

相關問題