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
我覺得我都忽略了很明顯的,簡單的最佳實踐,但我掙扎了一段時間了:) 也許我根本不需要流,但現在我甚至無法寫入到流和從別的地方讀書.. 因此,在短期我的問題是:
如何主要目標實現的Python是這樣?
如何向字符串寫入字符串並在其他線程中不斷讀取字符串?
一種選擇是編寫自己的處理程序,將其傳入的日誌記錄放入隊列中。後臺線程會一次讀取一條記錄(注意,不需要序列化)。不過,這取決於你接下來要做什麼。 – tdelaney