Я хочу перенаправить ведение журнала сообщений на некоторые методы обработки (например, чтобы сохранить все сообщения в очереди). В настоящее время я пытаюсь использовать logging.StreamHandler, чтобы писать в StringIO, а затем читать его где-то в другом месте. В моем случае это может быть поток, непрерывно считывающий из потока, но также может быть вызван метод обратного вызова для каждой записи журнала.перенаправление сообщений о протоколе python с потоками
import threading
import time
import sys
import logging
from StringIO import StringIO
# this thread shall read from a stream
# continuously and
def tread_fn(stream):
while not stream.eof(): <=== this is not valid but my current approach
l = stream.readline()
do_something(l)
stream = StringIO()
handler = logging.StreamHandler(stream)
log = logging.getLogger()
log.setLevel(logging.INFO)
# replace all log handlers
for handler in log.handlers:
log.removeHandler(handler)
log.addHandler(handler)
thread = threading.Thread(target = tread_fn, args=[stream])
thread.start()
for i in range(3):
time.sleep(1)
log.error("test") <=== should be handled line by line
Я чувствую, что я упустил из виду очевидный и простой передовой практики, но я изо всех сил на некоторое время теперь :) Может быть, мне не нужны потоки на всех, но в настоящее время я даже не в состоянии написать в поток и чтение из него где-то еще .. Так вкратце мои вопросы:
как главная цель достигнута питона путь?
Как записать строки в поток и непрерывно читать из него в другом потоке?
Один из вариантов заключается в том, чтобы написать собственный обработчик, который просто отбрасывает входящие записи журнала в очередь. Затем фоновый поток считывал записи (уведомление, без необходимости сериализации) по одному за раз. Однако это зависит от того, что вы хотите сделать дальше. – tdelaney