2017-05-25 47 views
15

我是新手到python。我正在嘗試登錄python,並且遇到了在嘗試通過記錄程序實例打印某些警告時,沒有發現處理程序記錄器錯誤。下面是我嘗試沒有處理程序可以找到記錄器

import logging 
logger=logging.getLogger('logger') 
logger.warning('The system may break down') 

的代碼,我得到這個錯誤沒有處理程序可以爲記錄器「記錄儀」

什麼困惑我發現是,當我第一次嘗試打印使用logging和警告然後通過logger,它工作正常,就像

>>> import logging 
>>> logging.warning('This is a WARNING!!!!') 
WARNING:root:This is a WARNING!!!! 
>>> 
>>> logger.warning('WARNING!!!!') 
WARNING:logger:WARNING!!!! 

有人可以對第二種情況發生的事情有所瞭解嗎?

+0

更多upvotes FYI類似的問題https://stackoverflow.com/questions/345991/python-no-handlers-could-be-found-for-logger-opengl - 錯誤 –

回答

3

對於通過logger記錄一些消息,在Python至少一個處理程序應被添加到logger對象。默認情況下,debug,warnlogging模塊中的其他功能將調用basicConfig,這又會將StreamHandler添加到root logger

它總是recommended將您需要的處理程序添加到您爲您的模塊寫入的記錄器對象。

你可以參考official Python docs,它有一個awesome tutorial或者你可以更好地檢查自己的日誌記錄模塊的源代碼。

只要你可以檢查在Python源殼牌本身,

import logging 
import inspect 
print(inspect.getsource(logging)) 
22

呼叫logging.basicConfig()

>>> import logging 
>>> logging.basicConfig() 
>>> logger = logging.getLogger('logger') 
>>> logger.warning('The system may break down') 
WARNING:logger:The system may break down 
+0

感謝分享!但我只是想知道爲什麼它在第二種情況下工作... – qwerty

+1

因爲logging.warning()調用logging.basicConfig()如果日誌未配置。 – phd

2

附加到博士的回答,稱logging.basicConfig()是一個方便的功能,這將讓您有一個默認StreamHandlerFormatter。如果您想快速擁有日誌記錄功能,這就夠了。您可以自定義它的行爲,通過傳遞basicConfig一些參數:

添加有用paramters:輸出時間戳消息

logger = logging.basicConfig(level=logging.DEBUG, 
     format='%(asctime)s - %(name)s - %(levelname)s - %message)s') 

這應該是適用於大多數的一次性需求的旁邊。如果您需要對配置進行更多控制,可以通過定義自己的記錄器屬性來添加更復雜的行爲。

複雜的例子:不使用basicConfig funtion

import logging 
logger = logging.getLogger("mylogger") 
streamHandler = logging.StreamHandler() 
streamHandler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %message)s') 
streamHandler.setFormatter(formatter) 

logger.addHandler(streamHandler) 

logger.info("Files copied") 
logger.warning("disk quota exceeded") 
>> 2017-12-06 11:11:12, 090 - mylogger - INFO Files copied 
>> 2017-12-06 11:11:12, 091 - mylogger - WARNING disk quota exceeded 

在一個更大的環境的下一個步驟中,將導出從先前創建的一個新的記錄器,以第一保持格式並保持一個log hierarchy

logger2 = logging.getLogger("mylogger.new") 
logger2.info("New Logger info") 
>> 2017-12-06 11:11:12, 091 - mylogger.new - New logger info 

一個很好的參考是記錄食譜: https://docs.python.org/2/howto/logging-cookbook.html

相關問題