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