私が何か間違ったことをしているのか、それともロギングの意図を誤解しているだけなのかはわかりません。
のインスタンスの実行中にロギングを使用しようとしています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ここで探しているものを達成するために、何らかの方法で伝播フローを変更することは可能ですか?