Получение сообщений журнала процесса python, открытого через подпроцесс

#python #logging #pygame #subprocess #interprocess

Вопрос:

У меня есть программа на python, которая использует pygame. Я хочу создать еще одно окно pygame для дополнительного контента и создать для этого отдельный скрипт. Я использую сокет и локальный хост для связи.

Я использую подпроцесс для запуска сценария, который отображает второе окно pygame. Этот скрипт содержит ряд сообщений журнала, которые не отображаются в выводе терминала, который я использую. Есть ли способ перенаправить сообщения журнала, чтобы они печатались на консоли вместе с сообщениями журнала основной программы?

До сих пор я настроил программу для ведения журнала, которая фиксирует зарегистрированные выходные данные:

 level = logging.DEBUG
def getLogger(module_name):
    wrapper = LogWrapper(module_name)
    return wrapper.getLogger(),wrapper

class LogWrapper():

    def __init__(self,module_name):
        self.module_name = module_name
        self.log_capture_string = None
        self.log_trace = []

    @property
    def trace(self):
        values = self.log_capture_string.getvalue()
        self.log_trace = self.log_trace values.split("n")
        return self.log_trace

    def getLogger(self, **kwargs):
        ### Create the logger
        logging.config.dictConfigClass(configuration).configure()
        logger = logging.getLogger(self.module_name)
        logger.setLevel(level)

        ### Setup the console handler with a FIFOIO object
        self.log_capture_string = FIFOIO(32768)
        ch = logging.StreamHandler(self.log_capture_string)
        ch.setLevel(logging.DEBUG)

        ### Optionally add a formatter

        ### Add the console handler to the logger
        logger.addHandler(ch)
        logger.info("set up logwrap for {}".format(self.module_name))

        return logger

class FIFOIO(io.TextIOBase):
    def __init__(self, size, *args):
        self.maxsize = size
        io.TextIOBase.__init__(self, *args)
        self.deque = collections.deque()
    def getvalue(self):
        return ''.join(self.deque)
    def write(self, x):
        self.deque.append(x)
        self.shrink()
    def shrink(self):
        if self.maxsize is None:
            return
        size = sum(len(x) for x in self.deque)
        while size > self.maxsize:
            x = self.deque.popleft()
            size -= len(x)
 

Но после запуска основной программы и вызова подпрограммы.logwrapper.trace по завершении не фиксирует никаких сообщений об ошибках из среды выполнения, только сообщение об инициализации, поэтому я ищу лучший способ доступа к этой информации.

Комментарии:

1. будьте осторожны с квадратичной сложностью self.log_trace = self.log_trace values.split("n") , лучше сделайте self.log_trace.extend(values.split("n"))