로깅 메시지를 일부 처리 방법 (예 : 대기열의 모든 메시지를 저장하기 위해)으로 리디렉션하고 싶습니다. 현재 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
나는 매우 분명하고 간단한 모범 사례를 간과하지만 어쩌면 내가 전혀 스트림을 필요가 없습니다 : 지금 잠시 동안 사투를 벌인거야하지만 현재 내가 심지어 쓰기 실패 것 같은 느낌이
방법의 주요 목표는 파이썬 방법을 달성 : 스트림과 다른 곳에서 읽는 .. 그래서 짧은 내 질문은에?
문자열을 스트림에 쓰고 다른 스레드에서 연속적으로 읽는 방법은 무엇입니까?
하나의 옵션은 들어오는 로그 레코드를 큐에 놓는 고유 한 처리기를 작성하는 것입니다. 그런 다음 백그라운드 스레드는 한 번에 하나씩 레코드 (통지, 직렬화 필요 없음)를 읽습니다. 그것은 당신이 다음에하고 싶은 것에 따라 다소 다릅니다. – tdelaney