Python logging 模塊使用指南

記錄日誌是追蹤事件的一種手段。經過添加日誌,開發者能夠清楚地瞭解發生了哪些事件,包括出現了哪些錯誤。logging 模塊提供了一系列便捷的函數,用於簡單的日誌記錄。它們分別是 debug(), info(), warning(), error()critical()javascript

簡單示例

下面是一個很是簡單的示例:html

import logging
logging.warning('Watch out!')   # 打印一條信息到命令行
logging.info('I told you so')   # 不會打印任何東西複製代碼

若是你運行着幾行代碼,你會看到命令行中輸出如下內容:java

WARNING:root:Watch out!複製代碼

因爲 logging 模塊默認的級別爲 WARNING,所以 INFO 級別的日誌不會被打印出來。輸出的日誌包含了級別和事件的描述。root 爲默認 logger 的名字,咱們能夠手動更改它,而且自定義日誌的輸出格式。python

記錄日誌到文件

不少狀況下,咱們會把日誌記錄到文件中,接下來咱們就來看看具體的操做。請從新打開一個 python 解釋器,而不要直接使用上述例子所用的解釋器,確保 logging 模塊可以被正確配置。app

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,所以全部的日誌都會被記錄下來。函數

多個模塊記錄日誌

若是你的程序包含了多個模塊,這裏有一個例子向你展現瞭如何組織它們的日誌輸出:ui

# myapp.py
import logging
import mylib

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()複製代碼
# mylib.py
import logging

def do_something():
    logging.info('Doing something')複製代碼

若是你運行 myapp.py 文件,你會在 myapp.log 文件中看到如下內容:this

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished複製代碼

記錄變量的數據

要記錄變量的數據,可使用一個格式串來格式化輸出,並將變量做爲參數傳遞給日誌記錄函數。spa

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.debug('This message should appear on the console')
logging.info('So should this')
logging.warning('And this, too')複製代碼

輸出以下:

DEBUG:This message should appear on the console
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 進階指南

logging 模塊採起了模塊化的方式並提供了幾個組件的類別:logger、handler、filter、formatter。

  • 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

參考文章:Logging HOWTO

做者:Wray Zheng
原文連接: www.codebelief.com/article/201…

相關文章
相關標籤/搜索