【问题标题】:Python global logging [duplicate]Python全局日志记录[重复]
【发布时间】:2012-06-21 04:59:40
【问题描述】:

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

【问题讨论】:

    标签: python logging


    【解决方案1】:

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

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

    【讨论】:

    • 即使使用自定义记录器设置,此解决方案也很有效。
    • 添加记录器适配器时是否有效?假设我在 codeA 中添加了一个适配器,它会在 codeB 中被拾取吗?
    【解决方案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
    

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

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

    【讨论】:

      【解决方案3】:

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

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

      from moduleA import log
      

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

      import logging
      log = logging.getLogger('')
      

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

      logging.info("Hello")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-29
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 2021-11-05
        • 2015-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多