9

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。どうすればそれを回避できますか?

4

3 に答える 3

28

すべてのコードにロガーをインポートさせるよりも、ロガーをインスタンス化する独自のロギング「モジュール」を作成することができます。考え:

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

具体的な例として、次のようにinのlog-variableをインポートできます。moduleAmodulesB

from moduleA import log

logging -moduleは、に返されたロガーの同じインスタンスを返すため、以下は同等ですmoduleA

import logging
log = logging.getLogger('')

別の解決策は、次のようにロギングモジュールのデフォルトロガーを使用することです。

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