2012-09-18 15 views
6

如果在代碼庫中傳播日誌語句,如何設置日誌記錄程序,以便在部署代碼時不必註釋每次對日誌記錄程序的調用投入生產?如何關閉日誌語句而不從代碼中刪除它們

這裏是我當前的代碼:

import logging 


logging.basicConfig(filename='./example.log', level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        datefmt='%m-%d %H:%M') 

logging.debug('debug failed') 
logging.info('info failed') 
logging.warning('A warning') 
+1

這不是基本的日誌記錄101嗎? – delnan

+2

@delman:如果它的101那麼請寫一個最佳實踐的答案 – Merlin

+0

我沒有資格這樣做,我只是相當確定這樣做的明顯方法,設置過濾拒絕所有消息,教程。 – delnan

回答

1

有日誌記錄的級別。根據日誌級別的嚴重程度,它將打印它。

Level Numeric value 
CRITICAL 50 
ERROR 40 
WARNING  30 
INFO 20 
DEBUG 10 
NOTSET 0 

根據日誌級別,它將打印報表。

您在此處指定的級別爲level = logging.DEBUG。因此,所有未設置的日誌級別都應打印出來。如果你希望只打印臨界水平,請改變等級= logging.CRITICAL

http://docs.python.org/release/2.5/lib/module-logging.html有更多的信息,而不是使用basicConfig

3

,可以更明確地建立記錄你想要的處理程序,基於任何標準。

import logging 

log = logging.getLogger("FOO") 
log.setLevel(logging.DEBUG) 

# needs a handler 
log.info('info') 
#No handlers could be found for logger "FOO" 

ch = logging.StreamHandler() 
log.addHandler(ch) 
log.info('info') 
# info 

log.removeHandler(ch) 

noop = logging.NullHandler() 
log.addHandler(noop) 
# nothing happens here 
log.info('info') 

你可以有一個條件語句,要麼增加你想,如果你在調試模式下運行的處理程序,或者你可以添加一個NullHandler,只是吸收日誌消息。您還可以配置每個處理程序的各個級別,以便您始終可以看到警告和更高級別的警告。除了主記錄器之外,每個處理程序可以有自己的級別。

您可以通過refer to the tutorials瞭解如何獲得更具體的關卡,處理程序和格式。

+0

我明白了你的觀點,真正的問題是:可以將過濾器設置爲警告,並警告進入黑洞。當需要轉儲到文件可能玩NullHandler。 – Merlin

+0

使用basicConfig和設置級別爲'99',似乎工作。文件創建,沒有打印到控制檯或文件。 – Merlin

+0

您可以根據腳本中的標誌添加不同的處理程序。如果你使用調試標誌運行它,你可以添加一個文件處理程序。否則,你添加一個空處理程序。你可以添加多個處理程序。也許設置爲警告的StreamHandler總是打印警告或更大,然後將可選文件處理程序設置爲調試以捕獲所有調試級別。將級別設置爲99只會使其變得非常高,以至於沒有日誌級別會與之匹配。它不是一個常見的方法。 – jdi

1

這裏有幾個非常簡單的答案。首先是簡單地評論basicConfig(...)聲明。這將不會設置任何記錄器,處理程序或格式化程序,這意味着您的debug(),info()等調用將無效。

另一個簡單的答案是將basicConfig()調用中的日誌級別設置爲高於DEBUG的值。 CRITICAL + 1會確保您永遠不會看到日誌消息。

然而,您提到了將代碼移植到生產環境中的一些問題,因此您可能想要提供-q-v命令行選項(假設這是一個CLI工具)。我通常的做法是開始WARNING級別,並且每個-q通過增加過濾器級別轉向更安靜的日誌記錄。相反,對於每個-v,轉向更詳細的日誌記錄。這是一段代碼,完全可以做到這一點。

from argparse import ArgumentParser 
from logging import basicConfig, CRITICAL, ERROR, WARNING, INFO, DEBUG 

parser = ArgumentParser() 
parser.add_argument("-v", "--verbose", action="count") 
parser.add_argument("-q", "--quiet", action="count") 

arguments = parser.parse_args() 

raw_log_level = 2 + (arguments.verbose or 0) - (arguments.quiet or 0) 
if raw_log_level <= 0: 
    log_level = CRITICAL 
elif raw_log_level == 1: 
    log_level = ERROR 
elif raw_log_level == 2:  # default 
    log_level = WARNING 
elif raw_log_level == 3: 
    log_level = INFO 
else:   
    log_level = DEBUG 

basicConfig(level=log_level) 
相關問題