Python全局日志记录

时间:2012-06-21 04:59:40

标签: python logging

如何使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是什么。我该如何解决这个问题?

3 个答案:

答案 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)

创建可用于

的全局记录器
  1. 创建新的日志文件或
  2. 返回全局日志文件的记录器。
  3. 创建一个名为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 functionsbuiltin constants。对于所有其他变量,函数......您必须使用关键字import

现在举个具体示例,您可以在log中导入moduleA - modulesB变量,如下所示:

from moduleA import log

以下内容是等效的,因为logging - 模块返回返回moduleA的记录器的同一实例:

import logging
log = logging.getLogger('')

另一种解决方案可能是使用logging模块的默认记录器,如下所示:

logging.info("Hello")