2013-08-23 1 views
3

로깅 메시지를 일부 처리 방법 (예 : 대기열의 모든 메시지를 저장하기 위해)으로 리디렉션하고 싶습니다. 현재 StringIO에 쓰고 다른 곳에서 읽을 수 있도록 logging.StreamHandler를 사용하려고합니다. 필자의 경우 이것은 스트림에서 지속적으로 읽는 스레드 일 수 있지만 모든 로그 항목에서 호출되는 콜백 메소드 일 수도 있습니다.스트림으로 파이썬 로깅 메시지 리디렉션

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

두 가지 질문을 하나씩했습니다. 주요 목표는 예를 들어 QueueHandler은 Python 3.2 이상에서 사용 가능하지만 이전 Python 버전에서는 logutils 프로젝트를 통해 사용할 수 있습니다.