見出し画像

超簡単Pythonで複数(マルチ)プロセスから単一ログファイル出力処理

超簡単にPythonで複数(マルチ)プロセスから単一ログファイル出力処理

単一プロセスの複数スレッドから単一ログファイルへの出力はサポートされていますが、複数プロセスから単一ログファイルへの出力はサポートされていないため、QueueとQueueHandlerを利用

1. ファイル作成

mp.py

import logging
import logging.handlers
import multiprocessing as mp


def listener_configurer():
   root = logging.getLogger()
   h = logging.handlers.TimedRotatingFileHandler(
       "mp.log", when="midnight", backupCount=20
   )
   f = logging.Formatter(
       "%(asctime)s %(processName)-10s %(name)-10s %(levelname)-8s %(message)s"
   )
   h.setFormatter(f)
   root.addHandler(h)


def listener(q, configurer):
   configurer()
   while True:
       logger = logging.getLogger()
       logger.handle(q.get())


def worker_configurer(q):
   h = logging.handlers.QueueHandler(q)
   root = logging.getLogger()
   root.addHandler(h)
   root.setLevel(logging.DEBUG)


def worker(q, configurer):
   configurer(q)
   for i in range(3):
       logger = logging.getLogger()
       logger.info("message #{}".format(i))


q = mp.Queue()
pl = mp.Process(
   name="listener",
   target=listener,
   args=(
       q,
       listener_configurer,
   ),
)
pw = mp.Process(
   name="worker",
   target=worker,
   args=(
       q,
       worker_configurer,
   ),
)
pl.start()
pw.start()
pw.join()
pl.join()

2. 実行

$ python mp.py

2021-09-16 12:01:03,215 worker     root       INFO     message #0
2021-09-16 12:01:03,217 worker     root       INFO     message #1
2021-09-16 12:01:03,217 worker     root       INFO     message #2

以上、超簡単!

3. 参考

4. 関連記事


いいなと思ったら応援しよう!