如何使Logger全局化,以便我可以在我制作的每个模块中使用它?
在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
是什么。我该如何解决这个问题?
答案 0 :(得分:21)
您可以创建自己的日志记录“模块”来实例化记录器,而不是将所有代码导入。想想:
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')
答案 1 :(得分:4)
创建可用于
的全局记录器创建一个名为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
现在在模块中创建一个新日志,说A.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")
在这种情况下无需传递文件名,因为我们将使用全局日志。
答案 2 :(得分:2)
默认情况下,模块只能访问builtin functions和builtin constants。对于所有其他变量,函数......您必须使用关键字import
。
现在举个具体示例,您可以在log
中导入moduleA
- modulesB
变量,如下所示:
from moduleA import log
以下内容是等效的,因为logging - 模块返回返回moduleA
的记录器的同一实例:
import logging
log = logging.getLogger('')
另一种解决方案可能是使用logging模块的默认记录器,如下所示:
logging.info("Hello")