Настройка регистратора для ведения журнала подпроцессов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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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