2013-08-23 3 views
3

Я хочу перенаправить ведение журнала сообщений на некоторые методы обработки (например, чтобы сохранить все сообщения в очереди). В настоящее время я пытаюсь использовать 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 

Я чувствую, что я упустил из виду очевидный и простой передовой практики, но я изо всех сил на некоторое время теперь :) Может быть, мне не нужны потоки на всех, но в настоящее время я даже не в состоянии написать в поток и чтение из него где-то еще .. Так вкратце мои вопросы:

  • как главная цель достигнута питона путь?

  • Как записать строки в поток и непрерывно читать из него в другом потоке?

+1

Один из вариантов заключается в том, чтобы написать собственный обработчик, который просто отбрасывает входящие записи журнала в очередь. Затем фоновый поток считывал записи (уведомление, без необходимости сериализации) по одному за раз. Однако это зависит от того, что вы хотите сделать дальше. – tdelaney

ответ

0

Вы задали два вопроса в одном - они должны быть отдельными вопросами. Ваша основная цель может быть достигнута с использованием, например, a QueueHandler, доступный в Python 3.2 и более поздних версиях, но также доступный для более ранних версий Python через проект logutils.

Смежные вопросы