2012-01-10 30 views
4

我已經安裝日誌如下:的Python setLevel上StreamHandler中不起作用

def setUp(): 

    LOG_FORMAT = '%(asctime)s %(levelname)-8s %(name)s %(message)s' 
    #LOG_FORMAT = '%(asctime)s %(name)s %(message)s' 

    logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT) 
    formatter = logging.Formatter(LOG_FORMAT) 

    ch = logging.StreamHandler() 
    ch.setLevel(logging.ERROR) 
    ch.setFormatter(formatter) 
    logging.getLogger().addHandler(ch) 

    LOG_FILENAME = 'file.log' 
    fh = logging.FileHandler(LOG_FILENAME, 'w') 
    fh.setLevel(logging.DEBUG) 
    fh.setFormatter(formatter) 
    logging.getLogger().addHandler(fh) 

但是,控制檯仍然顯示DEBUG消息。我在這裏錯過了什麼嗎?

注意,設置水平ERRORfh工作正常。

+0

創造了這個記錄StreamHandler中我想消息被傳播到您將日誌級別設置爲DEBUG的根記錄器。這與默認情況下根記錄器輸出到控制檯(猜測)的事實一起會給你看到的東西。 – 2012-01-10 20:25:04

回答

2

我認爲你需要刪除調用logging.basicConfig。該功能增加了另一個logging.StreamHandler,可能是打印不希望打印的消息的那個。

要檢查此問題,可以查看根記錄器的handlers屬性(該列表包含所有正在使用的處理程序)並驗證有多少個logging.StreamHandlers。此外,可能與電平的消息設置爲logging.ERROR被印刷,因爲兩個logging.StreamHandler S的兩倍。

我最後的建議是避免使用logging.basicConfig如果你要明確地配置在代碼中的處理程序。

編輯:只是爲了完整性,logging.BasicConfig源代碼如下:

if len(root.handlers) == 0: 
    filename = kwargs.get("filename") 
    if filename: 
     mode = kwargs.get("filemode", 'a') 
     hdlr = FileHandler(filename, mode) 
    else: 
     stream = kwargs.get("stream") 
     hdlr = StreamHandler(stream) 
    fs = kwargs.get("format", BASIC_FORMAT) 
    dfs = kwargs.get("datefmt", None) 
    fmt = Formatter(fs, dfs) 
    hdlr.setFormatter(fmt) 
    root.addHandler(hdlr) 
    level = kwargs.get("level") 
    if level is not None: 
     root.setLevel(level) 

在這裏你可以看到,除非filename傳遞,創建一個logging.StreamHandler

+0

輝煌,這就是它! – 2012-01-10 20:46:39

2

從Python文檔上logging.basicConfig

是否通過創建 StreamHandler中的一個默認的格式化程序並將其添加到根 記錄的日誌系統的基本配置。

正如你根記錄的調試級別設置爲logging.DEBUG,並且沒有關閉將消息轉發至根記錄你的DEBUG消息能由basicConfig