2015-01-13 20 views
1

我似乎有一個麻煩的地方在Python中設置記錄器。我試圖讀取控制程序的值(海洋模擬,有很多小的調整因素,這些因素在某個文件中最好保存在一個文件中,因爲我們傾向於在控制中使用它們)文件(基於JSON)。其中包括日誌設置的級別。由於這是我期望人們可能拼錯的東西,而且Python對此非常嚴格,所以我試圖在記錄器設置中進行嘗試 - 除非出現錯誤(併發出警告),否則會將其默認恢復爲INFO,如圖所示:設置Python的記錄器的水平嘗試/除了

with open(control['outFileStem'] + "_log.info", 'w'): 
    pass #Clear an existing logfile 
#Then set up the logging 
try: 
    logging.basicConfig(filename = control['outFileStem'] + "_log.info", level = control['logLevel']) 
except ValueError: 
    control['logLevel'] = "INFO" 
    logging.basicConfig(filename = control['outFileStem'] + "_log.info", level = logging.INFO) 
    logging.warning('WARNING: Logging Level set to INFO') 

logging.info('Control structure created successfully') 

但是,當我通過改變控制文件中的級別來試驗它時,它專門將級別設置爲WARNING。無論我使用哪種變體(例如logging.INFO,數字代碼,從控制對象中調用值而不是將其放入自己等等),都會發生這種情況。我無法弄清楚這裏發生了什麼。

如果它是相關的,控制是一個字典,我已經改變了init方法來處理從JSON文件中的閱讀很好,乾淨。

在此先感謝。

回答

0

請注意,basicConfig()(如記錄)如果處理程序已存在於根記錄器中,則什麼也不做。 basicConfig()實現首先設置處理程序,最後設置關卡,如果此時失敗,則處理程序已設置,並且except子句中的basicConfig()調用不執行任何操作。最簡單的辦法是,在例外條款中,設置使用

logging.getLogger().setLevel(logging.INFO) 

,而不是再次調用basicConfig()做到這一點的水平。

0

如何在控件中定義logLevel(它是什麼類型)?

您對此有何看法?

#!/usr/bin/env python 

import logging 

control = {"logLevel": "FAKE"} 

# get log level object which is just a number 
try: 
    log_level = getattr(logging, control["logLevel"]) 
except AttributeError as ex: 
    log_level = logging.INFO 

logging.basicConfig(filename = "logfile", level = log_level) 


logging.debug("debug test") 
logging.info("info test") 
logging.warn("warn test") 
logging.error("error test") 
+0

我試過使用logLevel作爲數字,字符串(例如「INFO」)和logging.WHATEVER類型。所有3個工作正常在嘗試:,他們都不工作在除了: 您的建議工程(謝謝!),但我仍然不知道我的原始片段沒有...? – AGPeddle

+0

對我來說,logging.basicConfig不會抱怨奇怪的日誌級別。你確定例外被觸發嗎?除非我看到配置json文件,否則我無法自己測試它。 例如,這不會觸發異常: logging.basicConfig(filename =「logfile」,level =「broken」) – mathewguest

+0

它肯定會觸發;我已經放棄了一些print()語句來檢查它。對我來說,如果我試圖通過任何不尋常的東西,那就是ValueError。我使用的Python 3.4,也許這是不同的版本? – AGPeddle