超簡単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
以上、超簡単!