1

私が何か間違ったことをしているのか、それともロギングの意図を誤解しているだけなのかはわかりません。

のインスタンスの実行中にロギングを使用しようとしていますmultiprocessing.Queue()。次のように、ブロックroot_logger内のモジュールにインスタンスを設定します。if __name__ == "__main__":

if __name__ == "__main__":
    root_logger = logging.getLogger()
    hndlr = logging.FileHandler(filename='root_logger.log', mode='w')
    root_logger.addHandler(hndlr)
    root_logger.setLevel(logging.DEBUG)

を介してマルチプロセッシング ロガーへの参照を取得しmultiprocessing.get_logger()ます。

次に、ワーカー プロセス内で、別のロガーを次のように設定します。

from somemodule import somefunction

class Worker(object):
    def __init__(self, filename):
        self.filename = filename
    def _log_setup(self):
        '''Done outside of init to avoid trying to pickle the logging instance.'''
        #Create a unique logger
        self.logger = logging.getLogger('Worker_'+self.filename[0:13])
        self.logger.setLevel(logging.DEBUG)
        #Create a unique log file
        hndlr = logging.FileHandler(filename='./' + os.path.basename(self.filename) + '.log', mode='w')
        self.logger.addHandler(hndlr)
    def __call__(self):
        self._log_setup()
        self.logger.info('Logged from worker')
        somefunction(self.filename)

次のようになりsomemodule.somefunction()ます。

def somefunction(filename):
    log.info('Doing something to %s' % filename)

私が見たいもの:

  • root_logger(root_logger.log)からのログ ファイルには、if __name__ == "__main__":ブロックで実行されたすべての出力が含まれている必要があります。
  • のログ ファイルにroot_loggerは、マルチプロセッシング パッケージからの出力も含まれている必要があります。
  • 一意のワーカー ログ ファイル (Worker_YYYYJJJHHMMSS.log) には、 への呼び出しからのすべてのログ出力と、すべての呼び出しからWorker.loggerの出力 (この場合はsomefunction())が含まれている必要があります。
  • からのログ ファイルには、以上のroot_logger呼び出しからの出力のみを含めることが望ましいですが、これは必須ではありません。Worker.logger.warning()

私が現在見ているもの:

  • のログ ファイルには、ブロックで実行されたすべての出力がroot_logger 正しく含まれています。if __name__ == "__main__":
  • のログ ファイルには、 によって返されたロガー インスタンスからの出力がroot_logger 正しくmultiprocessing.get_logger()含まれています。
  • のログ ファイルには、 に含まれるロガー インスタンスからの出力がroot_logger 誤って含まれていますsomemodule.somefunction()
  • 固有のワーカー ログ ファイル (Worker_YYYYJJJHHMMSS.log)には、 への呼び出しからの出力が正しくWorker.logger含まれています。
  • ワーカー ファイルのログには、 のロガー インスタンスへの呼び出しからの出力が誤っsomemodule.somefunction()て含まれていません。

loggingここで探しているものを達成するために、何らかの方法で伝播フローを変更することは可能ですか?

4

1 に答える 1

0

ログからsomemodule.somefunction()のデータが間違った場所に送信されていることを除いて、すべてが機能しているようです。

somemodule.somefunction()あなたはそれが似ていると言います

def somefunction(filename):
    log.info('Doing something to %s' % filename)

あなたの関数では定義されていないのでlog、モジュールレベルで定義されていることを願っています。これは、モジュール レベルにあるロガーがデータの送信先になることを意味します。あなたのコードが私のようなものであれば、そのモジュール レベルのロガーはルート ロガーにデータを送信するように設定されています。Worker.logger特定のロギング インスタンス (つまり) を渡して、代わりにそれを使用する必要がある場合があります。

于 2012-05-08T15:55:27.067 に答える