マルチプロセッシング サーバーでロギングを実装しようとしています。ドキュメントによると、「複数のプロセスから単一のファイルへのログ記録はサポートされていません」。このステートメントをチェックする小さなプログラムを作成しました。
import logging
import multiprocessing
import os
log = logging.getLogger()
def setup_logger():
formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s: %(message)s')
fileHandler = logging.FileHandler('test.log')
fileHandler.setFormatter(formatter)
log.setLevel(logging.DEBUG)
log.addHandler(fileHandler)
def write_log_entries(identifier, start_event):
start_event.wait()
for i in range(100):
s = ''.join(str(identifier) for k in range(30))
log.info('[{}, {}] --- {}'.format(os.getpid(), identifier, s))
if __name__ == '__main__':
setup_logger()
procs = []
start_event = multiprocessing.Event()
for i in range(100, 300):
p = multiprocessing.Process(target=write_log_entries, args=(i, start_event))
procs.append(p)
for p in procs:
p.start()
start_event.set()
for p in procs:
p.join()
上記のコードを実行した後、「test.log」に完全な混乱が見られると予想していましたが、すべて問題ないようです (もちろん、タイムスタンプは除きますが、これは順番どおりではありません)。
ログファイルが複数のプロセスによって同時に書き込まれているときに、ログエントリが重複しない理由を誰か説明できますか? この場合、log.info() はアトミックと見なすことができますか?