2014-05-14 31 views
1

我有一個腳本,我試圖有日誌記錄各種事情(可選)到控制檯和日誌文件的選項。我還希望能夠爲日誌目標設置不同的日誌級別,即將DEBUG設置爲日誌文件,將INFO設置爲控制檯。Python的「根」日誌級別和其他處理程序的水平

我有這樣的工作已經通過啓動一個「根」記錄器,然後任選此logger內,我可以獨立地設置的日誌級別創建不同的處理程序。但是,我擔心這需要爲「根」記錄器設置儘可能低的日誌級別,即使我沒有將任何處理程序設置爲低級別,也許系統仍然會陷入一個較大的困境日誌事件的數量。爲了說明,如果我設置了logger.setLevel(logging.WARNING),然後在fileHandler或consoleHandler中嘗試使用'logging.DEBUG',我仍然只能在我的一個日誌中獲得WARNING級日誌打印目的地。這對我來說很有意義,因爲fileHandler和consoleHandler是記錄器的子對象(原諒我缺乏適當的詞彙),但是我只想確保具有儘可能低的日誌級別的「根」記錄器實際上並不實際除非處理程序實際設置爲低級別,否則請執行任何操作。

import logging 
import logging.handlers 

LOG_TO_STDOUT = 1 
ENABLE_LOGFILE = 1 

logFormatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
logger = logging.getLogger(__name__) 
### DO NOT CHANGE main logger log level. This sets the lowest log level available for other loggers 
logger.setLevel(logging.DEBUG) 

if ENABLE_LOGFILE == 1: 
    fileHandler = logging.handlers.RotatingFileHandler('crisco.log', maxBytes=2000, backupCount = 5) 
    fileHandler.setFormatter(logFormatter) 

    ### Set logfile log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) 
    fileHandler.setLevel(logging.DEBUG) 

    logger.addHandler(fileHandler) 

if LOG_TO_STDOUT == 1: 
    consoleHandler = logging.StreamHandler() 
    consoleHandler.setFormatter(logFormatter) 

    ### Set console log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) 
    consoleHandler.setLevel(logging.INFO) 

    logger.addHandler(consoleHandler) 

logger.info("this message should show both in file and console") 
logger.debug("this message should be in the file only") 
+0

我不確定你的意思是「儘可能低的日誌級別給我的」根「記錄器實際上沒有做任何事情」。如果這是你所害怕的,它不會在其他任何地方記錄消息。 –

+0

是的,我知道它不會在任何其他地方記錄消息,但是我是否會因爲將根日誌記錄器設置爲DEBUG級別而在性能方面遇到問題,即使我的控制檯/文件處理程序設置得更高?或者,實際的stdout/write-to-file實際的命中和日誌記錄並不在任何地方(例如,如果兩個處理程序都設置爲INFO,則爲DEBUG消息)實際上並不會帶來很大的損失? – ericus

回答

2

docs

處理器

...

的setLevel()方法,就像在Logger對象,指定將被分派到最低程度適當的目的地。爲什麼有兩個setLevel()方法?記錄器中設置的級別決定了它將傳遞給其處理程序的消息的嚴重程度。每個處理程序中設置的級別確定處理程序將發送哪些消息。

2

我只是想確保具有儘可能低的日誌級別到我的「根」記錄器實際上不會做任何事情,除非處理程序實際設置爲低級別。

這不是它的工作方式。記錄器的日誌級別是處理程序的入口,如果希望處理程序接收消息,則必須將其設置爲低於最低處理程序。記錄器會將所有通過日誌級別檢查的消息傳遞給它的所有處理程序,並讓處理程序決定是否採用它。有一些開銷,但對於大多數程序來說,它是微不足道的。

相關問題