記錄日誌是追蹤事件的一種手段。通過新增日誌,開發者可以清楚地了解發生了哪些事件,包括出現了哪些錯誤。logging 模組提供了一系列便捷的函式,用於簡單的日誌記錄。它們分別是debug()
,info()
,warning()
,error()
和critical()
。
下面是乙個非常簡單的示例:
import logging
logging.warning('watch out!') # 列印一條資訊到命令列
logging.info('i told you so') # 不會列印任何東西
複製**
如果你執行著幾行**,你會看到命令列中輸出以下內容:
warning:root:watch out!複製**
由於 logging 模組預設的級別為warning
,因此info
級別的日誌不會被列印出來。輸出的日誌包含了級別和事件的描述。root
為預設 logger 的名字,我們可以手動更改它,並且自定義日誌的輸出格式。
很多情況下,我們會把日誌記錄到檔案中,接下來我們就來看看具體的操作。請重新開啟乙個 python 直譯器,而不要直接使用上述例子所用的直譯器,確保 logging 模組能夠被正確配置。
import logging
logging.basicconfig(filename='example.log',level=logging.debug)
logging.debug('this message should go to the log file')
logging.info('so should this')
logging.warning('and this, too')複製**
如果我們開啟example.log
檔案,可以看到以下內容:
debug:root:this message should go to the log file
info:root:so should this
warning:root:and this, too複製**
這個例子告訴你如何設定日誌級別,從而控制要記錄的日誌。由於我們在這個例子中設定的級別是debug
,因此所有的日誌都會被記錄下來。
如果你的程式包含了多個模組,這裡有乙個例子向你展示了如何組織它們的日誌輸出:
import logging
import mylib
defmain
(): logging.info('started')
mylib.do_something()
logging.info('finished')
if __name__ == '__main__':
main()複製**
# mylib.py
import logging
defdo_something
(): logging.info('doing something')複製**
info:root:started
info:root:doing something
info:root:finished複製**
要記錄變數的資料,可以使用乙個格式串來格式化輸出,並將變數作為引數傳遞給日誌記錄函式。
import logging
logging.warning('%s before you %s', 'look', 'leap!')複製**
輸出內容:
warning:root:look before you leap!複製**
你也可以使用 python 自帶的字串格式化函式:
import logging
logging.warning('{} before you {}'.format('look', 'leap!'))複製**
import logging
logging.basicconfig(format='%(levelname)s:%(message)s', level=logging.debug)
logging.info('so should this')
logging.warning('and this, too')複製**
輸出如下:
info:so should this
warning:and this, too複製**
注意到之前的例子**現的root
在這裡已經消失了。要了解所有能出現在格式串裡的東西,請參考 logrecord attributes。但如果只是簡單使用,你只需要levelname
(級別)、message
(事件描述,包括變數資料)以及事件發生的時間,這點將在下面講解。
要在日誌中顯示日期和時間,你需要在格式串中加入%(asctime)s
:
import logging
logging.basicconfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')複製**
輸出如下:
2010
-12-12
11:41:42,612 is when this event was logged.複製**
格式串中的時間格式引數與 time.strftime() 中支援的引數相同。
logging 模組採取了模組化的方式並提供了幾個元件的類別:logger、handler、filter、formatter。
日誌事件資訊在乙個 logrecord 例項中的 logger、handler、filter 和 formatter 之間傳遞。
乙個給 logger 命名的好習慣是使用模組級別的 logger。在每乙個需要記錄日誌的模組內使用以下方式來給 logger 命名:
logger = logging.getlogger(__name__)複製**
這種情況下,logger 的名字會追蹤包/模組的層次結構,並且我們可以直觀地看到事件是由哪個模組記錄的。
層次結構中最頂級的 logger 稱為 root logger。當我們呼叫 logging 模組的debug()
,info()
,warning()
,error()
和critical()
函式時,會使用 root logger 對應的同名方法。這些函式與 root logger 中的同名方法具有相同的引數簽名。root logger 在輸出時名字為root
。
當然,我們也可以將資訊記錄到不同的目的地。我們可以將日誌記錄到檔案、http get/post 位置、郵件(通過 smtp)、普通套接字或系統專用的日誌機制,例如 syslog 或 windows nt 事件日誌。目的地由handler
類進行處理。如果內建的handler
類沒有滿足你的要求,你可以建立乙個自己的日誌目的地類。
預設情況下,不會給日誌資訊設定目的地。你可以使用 basicconfig() 來指定目的地,正如之前所給的例子一樣。如果你呼叫了debug()
,info()
,warning()
,error()
和critical()
函式,它們會檢查是否設定了目的地,如果未設定目的地,則預設使用命令列(sys.stderr)作為目的地,並使用預設的格式來顯示資訊。
basicconfig() 函式預設的格式為:
severity:logger name:message複製**
你可以通過傳遞乙個格式串以及格式引數給 basicconfig() 來改變輸出格式。關於格式串構建的所有選項,請參考 formatter objects。 Python logging模組學習
import logging 日誌級別列表,預設為logging.warning levels logging.notset,logging.debug,logging.info,logging.warning,logging.error,logging.critical log format as...
python logging模組簡介
logging模組是python內建的標準模組,主要用於輸出執行日誌,可以設定輸出日誌的等級 日誌儲存路徑 日誌檔案回滾等。相對於print,該模組具有可以決定在列印什麼級別的資訊和將資訊輸出放置在什麼地方的優點。配置logging的基本設定,並在控制台輸出 import logging loggi...
Python logging日誌模組
1.日誌的級別 日誌一共分成5個等級,從低到高分別是 1 debug 2.info 3.warning 4.error 5.critical說明 這5個等級,也分別對應5種打日誌的方法 debug info warning error critical。預設的是 warning,當在warning或...