2013-08-23 67 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 

我覺得我都忽略了很明顯的,簡單的最佳實踐,但我掙扎了一段時間了:) 也許我根本不需要流,但現在我甚至無法寫入到流和從別的地方讀書.. 因此,在短期我的問題是:

  • 如何主要目標實現的Python是這樣?

  • 如何向字符串寫入字符串並在其他線程中不斷讀取字符串?

+1

一種選擇是編寫自己的處理程序,將其傳入的日誌記錄放入隊列中。後臺線程會一次讀取一條記錄(注意,不需要序列化)。不過,這取決於你接下來要做什麼。 – tdelaney

回答

0

你在一個問中提出了兩個問題 - 他們應該是單獨的問題。您的主要目標可以通過使用例如一個QueueHandler,在Python 3.2和更高版本中可用,但也可通過logutils項目獲得較早的Python版本。