Python全局日志记录

2024-06-23 02:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使记录器全局化,以便可以在生成的每个模块中使用它?

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


Tags: 模块answerimportinfologloggingnotinteger
3条回答

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

现在对于您的具体示例,您可以导入logmoduleAlog-变量,如下所示:

from moduleA import log

由于logging-模块返回的日志记录器实例与返回到moduleA的日志记录器实例相同,因此以下内容是等效的:

import logging
log = logging.getLogger('')

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

logging.info("Hello")

创建可用于

  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")

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

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

日志.py:

import logging
log = logging.getLogger('')

代码a.py:

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

代码.py:

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

相关问题 更多 >