Сейчас у меня есть следующее, что делает работает:
Код: Выделить всё
import logging
from logging.handlers import QueueHandler
from itertools import repeat
from multiprocessing import Process, Pool, Queue, cpu_count
from multiprocessing.managers import BaseManager, NamespaceProxy
class SharedObj:
def __init__(self):
self.attr1 = 0
class SharedProxy(NamespaceProxy):
_exposed_ = ("__getattribute__", "__setattr__", "__delattr__")
class QueueManager(BaseManager):
BaseManager.register("Queue", Queue)
BaseManager.register("SharedObj", SharedObj, SharedProxy)
class Main:
def __init__(self):
self.logger = logging.getLogger(__name__)
def _loggingSubprocess(self, queue):
self.logger.addHandler(QueueHandler(queue))
while True:
try:
logData = queue.get()
if logData is None:
break
except EOFError:
break
self.logger.handle(logData)
def _subProc(self, iterNum, sharedObj, queue):
self.logger.debug(f"In subproc {iterNum}")
sharedObj.attr1 += iterNum
def run(self):
with QueueManager() as manager:
queue = manager.Queue()
shObj = manager.SharedObj()
_ = Process(target=self._loggingSubprocess, args=(queue,)).start()
pool = Pool(processes=cpu_count() - 2)
pool.starmap(
self._subProc,
zip(
range(10),
repeat(shObj),
repeat(queue),
)
)
def setupLogger():
logConfig = {
"format": "%(asctime)s %(filename)s->%(funcName)s():%(lineno)s %(levelname)s: %(message)s",
"datefmt": "%m/%d/%Y %I:%M:%S",
"encoding": "utf-8",
"loglevel": "DEBUG",
"warnings": True
}
logLevels = {
"CRITICAL": logging.CRITICAL,
"DEBUG": logging.DEBUG,
"ERROR": logging.ERROR,
"INFO": logging.INFO,
"WARNING": logging.WARNING,
}
logging.basicConfig(
filename="logs/logFile.log",
format=logConfig["format"],
datefmt=logConfig["datefmt"],
encoding=logConfig["encoding"],
level=logLevels[logConfig["loglevel"]],
)
logging.captureWarnings(logConfig["warnings"])
setupLogger()
if __name__ == "__main__":
Main().run()
Код: Выделить всё
if __name__ == "__main__":
setupLogger()
Main().run()
Подробнее здесь: https://stackoverflow.com/questions/786 ... ss-logging