Настройка регистратора для ведения журнала подпроцессовPython

Программы на Python
Anonymous
Настройка регистратора для ведения журнала подпроцессов

Сообщение Anonymous »

Я пытаюсь запустить простой скрипт Python, который записывает данные из подпроцесса в мой файл журнала, используя мой регистратор классов.
Сейчас у меня есть следующее, что делает работает:

Код: Выделить всё

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()
но если я перенесу вызов setupLogger() внутрь пространства имен __main__, он больше не будет работать правильно.

Код: Выделить всё

if __name__ == "__main__":
setupLogger()
Main().run()
Почему вызов setupLogger не может произойти внутри __main__?

Подробнее здесь: https://stackoverflow.com/questions/786 ... ss-logging

Вернуться в «Python»