как войти в StringIO из многопроцессорного процесса - PullRequest
2 голосов
/ 25 января 2020

Я просто не могу заставить StreamHandler работать со StringIO, чтобы принимать протоколирование от Процесса. Странно то, что поток на стандартный вывод работает просто отлично.

Это мой код:


from time import sleep
import logging
import multiprocessing
from io import StringIO


logBuffer = StringIO()
#logging.basicConfig(level=logging.DEBUG,stream=logBuffer)
logging.basicConfig(level=logging.DEBUG)
logging.debug('This will get logged')


def main():
    for i in range(10):
        logging.debug('i=%i' % i)
        print(i)
        sleep(0.5)

# start process
proc = multiprocessing.Process(target=main )
proc.start()
proc.join()

print(logBuffer.getvalue())
sleep(3)

с использованием logging.basicConfig(level=logging.DEBUG) выводит все данные на стандартный вывод:

DEBUG:root:This will get logged
DEBUG:root:i=0
0
DEBUG:root:i=1
1
DEBUG:root:i=2
2
DEBUG:root:i=3
3
DEBUG:root:i=4
4
DEBUG:root:i=5
5
DEBUG:root:i=6
6
DEBUG:root:i=7
7
DEBUG:root:i=8
8
DEBUG:root:i=9
9

при попытке захвата с помощью StringIO с logging.basicConfig(level=logging.DEBUG,stream=logBuffer) захватывает только текущий основной вывод:

0
1
2
3
4
5
6
7
8
9
DEBUG:root:This will get logged

Кто-нибудь может помочь? Также приветствуются другие решения для передачи выходных данных процесса в родительский процесс в режиме реального времени.

1 Ответ

0 голосов
/ 25 января 2020

Я нашел ответ в logging-cookbook , используя QueueHandler, поэтому я отвечу на свой вопрос (RTFM) ;-).

Однако более простым решением кажется переключение на Threading и передача экземпляра регистратора в функцию trhead.

...