9

如何使 Logger 全局化,以便我可以在我制作的每个模块中使用它?

在 moduleA 中是这样的:

import logging
import moduleB

log = logging.getLogger('')

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

在模块B中使用这个:

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

目前,我会收到一个错误,因为 moduleB 不知道是什么log。我该如何解决?

4

3 回答 3

28

您可以创建自己的日志记录“模块”来实例化记录器,而不是让所有代码导入它。思考:

记录器.py:

import logging
log = logging.getLogger('')

代码A.py:

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

代码B.py:

from logger import log
log.warn('some other thing')
于 2012-06-21T05:14:18.593 回答
7

创建一个全局记录器,可用于

  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

现在在你的模块中创建一个新日志,比如 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")

在这种情况下不需要传递文件名,因为我们将使用全局日志。

于 2016-11-23T13:20:26.890 回答
2

默认情况下,模块只能访问内置函数内置常量。对于所有其他变量、函数……您必须使用关键字import.

现在对于您的具体示例,您可以像这样导入log- 变量:moduleAmodulesB

from moduleA import log

以下将是等效的,因为logging -module 返回与返回到的 logger 相同的实例moduleA

import logging
log = logging.getLogger('')

另一个解决方案是使用日志模块的默认记录器,如下所示:

logging.info("Hello")
于 2012-06-21T05:13:40.220 回答