2012-06-21 161 views
5

如何使記錄器全局化,以便我可以在每個模塊中使用它?Python全局日誌記錄

像這樣的東西在moduleA:

import logging 
import moduleB 

log = logging.getLogger('') 

result = moduleB.goFigure(5) 
log.info('Answer was', result) 

有了這個moduleB:

def goFigure(integer): 
    if not isinstance(integer, int): 
     log.critical('not an integer') 
    else: 
     return integer + 1 

目前,我會得到一個錯誤,因爲moduleB不知道什麼log是。我該如何解決這個問題?

回答

17

你可以讓你自己的日誌「模塊」實例化記錄器,而不是所有的代碼導入。認爲:

logger.py:

import logging 
log = logging.getLogger('') 

codeA.py:

from logger import log 
log.info('whatever') 

codeB.py:

from logger import log 
log.warn('some other thing') 
+0

非常感謝你 – MFB

+0

即使使用自定義記錄器設置,該解決方案也能像魅力一樣工作。 – Centurion

2

模塊默認只能訪問builtin functionsbuiltin constants。對於所有其他變量,函數...你必須使用關鍵字import

現在爲您具體的例子,你可以導入log -variable的moduleAmodulesB這樣的:

from moduleA import log 

以下是等效的,因爲 - 模返回是記錄器的相同實例logging回到moduleA

import logging 
log = logging.getLogger('') 

爲你另一種解決辦法是使用logging模塊像THI的默認記錄器s:

logging.info("Hello") 
+0

非常感謝你 – MFB

2

創建全局記錄器可用於

  1. 創建新的日誌文件或
  2. 爲全局日誌文件返回記錄器。

創建一個名爲名爲myLogger.py模塊:這將有日誌創建代碼

myLogger.py:

import logging 

def myLog(name, fname = 'myGlobalLog.log'): 
'''Debug Log'''                         
    logger = logging.getLogger(name);                    
    logger.setLevel(logging.DEBUG)                     
    fhan = logging.FileHandler(fname)                    
    fhan.setLevel(logging.DEBUG)                      
    logger.addHandler(fhan)                       
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')       
    fhan.setFormatter(formatter) 
    '''comment this to enable requests logger'''                  
    #logger.disabled = True 
    return logger 

我們創建一個新的記錄您的模塊中一說.py

from myLogger import myLog 
log = myLog(__name__, 'newLog.log') 
log.debug("In new log file") 

因此,您必須在獲取記錄器的同時傳遞文件名。

在A中使用全局記錄器。py:

from myLogger import myLog 
log = myLog(__name__) 
log.debug("In myGlobalLog file") 

由於我們要使用全局日誌,在這種情況下無需傳遞文件名。