2012-06-21 162 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") 

由于我们要使用全局日志,在这种情况下无需传递文件名。