2015-08-13 26 views
1

我想將所有中間日誌消息(警告,信息,錯誤)存儲到python中的字符串中,最後在程序結束時將所有內容顯示爲控制檯的報告。將記錄器消息存儲在字符串中

我試圖按照 http://opensourcehacker.com/2011/02/23/temporarily-capturing-python-logging-output-to-a-string-buffer/ 中列出的步驟操作,但未成功。

有人可以告訴我一個簡短,乾淨的方法來做到這一點嗎?

這是我已經試過了現在:

log = logging.getLogger('basic_logger') 
    log.setLevel(logging.DEBUG) 
    report="" 

      memory_handler=logging.handlers.MemoryHandler(1024*20,logging.ERROR,report) 
memory_handler.setLevel(logging.DEBUG) 
log.addHandler(memory_handler) 

log.info("hello world") 
memory_handler.flush() 
print "report:",report 
+0

你能解釋一下什麼錯誤? – Navneet

+0

在這裏看到答案:http://stackoverflow.com/a/9534960/459745 –

回答

4

它可以像伐木一樣簡單到StringIO對象:

import logging 
try: 
    from cStringIO import StringIO  # Python 2 
except ImportError: 
    from io import StringIO 

log_stream = StringIO()  
logging.basicConfig(stream=log_stream, level=logging.INFO) 

logging.info('hello world') 
logging.warning('be careful!') 
logging.debug("you won't see this") 
logging.error('you will see this') 
logging.critical('critical is logged too!') 

print(log_stream.getvalue()) 

輸出

 
INFO:root:hello world 
WARNING:root:be careful! 
ERROR:root:you will see this 
CRITICAL:root:critical is logged too! 


如果你想記錄只在水平這些消息WARN ,INFO和ERROR,你可以使用過濾器來完成。 LevelFilter下面檢查每個日誌記錄的級別沒有,只允許所需的水平(S)的那些記錄:

import logging 
try: 
    from cStringIO import StringIO  # Python 2 
except ImportError: 
    from io import StringIO 

class LevelFilter(logging.Filter): 
    def __init__(self, levels): 
     self.levels = levels 

    def filter(self, record): 
     return record.levelno in self.levels 

log_stream = StringIO()  
logging.basicConfig(stream=log_stream, level=logging.NOTSET) 
logging.getLogger().addFilter(LevelFilter((logging.INFO, logging.WARNING, logging.ERROR))) 

logging.info('hello world') 
logging.warning('be careful!') 
logging.debug("you won't see this") 
logging.error('you will see this') 
logging.critical('critical is no longer logged!') 

print(log_stream.getvalue()) 

輸出

 
INFO:root:hello world 
WARNING:root:be careful! 
ERROR:root:you will see this 

-1

也許這個例子的代碼就足夠了。
一般來說,你應該發佈你的代碼,以便我們可以看到發生了什麼。
當您按照任何給定的教程進行操作時,您還應該查看日誌記錄模塊的實際Python文檔。
https://docs.python.org/2/library/logging.html

標準的Python日誌模塊可以登錄到一個文件。完成日誌記錄後,可以將該文件的內容打印到shell輸出中。

# Do some logging to a file 
fname = 'mylog.log' 
logging.basicConfig(filename=fname, level=logging.INFO) 
logging.info('Started') 
logging.info('Finished') 

# Print the output 
with open(fname, 'r') as f: 
    print f.read() # You could also store f.read() to a string 
+1

我不想使用一個文件,然後打印該文件的輸出。我正在尋找一種使用某種處理程序直接記錄到字符串的方法? - 可能是一個內存處理程序? https://docs.python.org/2/library/logging.handlers.html – trup

+0

MemoryHandler.setTarget(StreamHandler)? – Anton

0

您也可以編寫自己的流類。正如https://docs.python.org/2/library/logging.handlers.html所述,只有writeflush用於流式傳輸。

例子:

import logging 

class LogStream(object): 
    def __init__(self): 
     self.logs = '' 

    def write(self, str): 
     self.logs += str 

    def flush(self): 
     pass 

    def __str__(self): 
     return self.logs 

log_stream = LogStream() 
logging.basicConfig(stream=log_stream, level=logging.DEBUG) 

log = logging.getLogger('test') 
log.debug('debugging something') 
log.info('informing user') 

print(log_stream) 

輸出:

DEBUG:test:debugging something 
INFO:test:informing user 
相關問題