2011-09-15 92 views
10

在我當前的項目有行代碼,看起來像這樣千:重新定義日誌根記錄

logging.info("bla-bla-bla") 

我不想改變所有這些行,但我會改變日誌的行爲。我的想法是改變根記錄到其他Experimental記錄器,這是由ini文件配置:

[loggers] 
keys = Experimental 

[formatter_detailed] 
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s 

[handler_logfile] 
class = FileHandler 
args = ('experimental.log', 'a') 
formatter = detailed 

[logger_Experimental] 
level = DEBUG 
qualname = Experimental 
handlers = logfile 
propagate = 0 

現在設置新的根記錄是由這一段代碼來完成:

logging.config.fileConfig(path_to_logger_config) 
logging.root = logging.getLogger('Experimental') 

重新定義的根記錄器安全嗎?也許有更方便的方法嗎?

我試圖使用谷歌,並通過看stackoverflow的問題,但我沒有找到答案。

+0

首先。這是否工作?你有沒有真正的問題?第二。定義「更方便」兩行代碼看起來非常方便。你可以想象多少方便? –

+0

它的工作原理!但我懷疑,這看起來像一個黑客。 「更方便」是指:「使用日誌模塊的某些標準功能」。抱歉。 –

+0

好人!格式很棒。 –

回答

11

建議您使用而不是以您描述的方式重新定義根記錄器。一般來說,你應該只直接使用根記錄的小腳本 - 對於較大的應用程序,最好的做法是使用

logger = logging.getLogger(__name__) 

每次在您使用日誌模塊中,然後撥打電話到Logger.EVENTS會()等。

如果您只想記錄到文件中,爲什麼不直接向根記錄器添加文件處理程序?您可以使用例如

if __name__ == '__main__': 
    logging.basicConfig(filename='experimental.log', filemode='w') 
    main() # or whatever your main entry point is called 

或通過配置文件。

更新:當我說「你被告知」時,我的意思是我,在這個答案中;-)雖然你可能沒有遇到任何問題在你的情況下,覆蓋模塊是不好的做法屬性沒有被設計爲被覆蓋。例如,根記錄器是一個不同類的實例(它不是公共API的一部分),並且在記錄機器中還有其他對它的引用,它們仍然指向舊值。這些事實都可能導致難以調試的問題。由於日誌包允許有多種方法來實現你想要的(看起來,記錄到文件而不是控制檯),那麼你應該使用已經提供的機制。

+0

「你被建議...」在哪裏?這是什麼問題?答案的其餘部分「總的來說......」非常好。但是第一句話會從一些證據或文件中受益。 –

+0

'logging.root'屬於類'logging.RootLogger',而不是'logging.Logger'。這些類的行爲大多是相同的,但在某些情況下可能會遇到不同的行爲。有些類型的檢查員也可能會提出警告。 – DarksteelPenguin

1

logger = logging.getLogger() 將名稱留空將使您返回根記錄器。

logger = logging.getLogger('name') 給你另一個記錄器。