logging模塊定義的函數和類爲應用程序和庫的開發實現了一個靈活的事件日誌系統。logging模塊是Python的一個標準庫模塊,由標準庫模塊提供日誌記錄API的關鍵好處是全部Python模塊均可以使用這個日誌記錄功能。因此,你的應用日誌能夠將你本身的日誌信息與來自第三方模塊的信息整合起來。php
logging模塊默認定義瞭如下幾個日誌等級,它容許開發人員自定義其餘日誌級別,可是這是不被推薦的,尤爲是在開發供別人使用的庫時,由於這會日誌級別的混亂。python
日誌等級nginx |
描述網絡 |
DEBUG函數 |
最詳細的日誌信息,典型應用場景是問題診斷spa |
INFO線程 |
信息詳細程序僅次於DEBUG,一般只記錄關鍵節點信息,用於確認一切都按照咱們預期的那樣進行工做debug |
WARNING調試 |
當某些不指望的事情發生時記錄的信息(如磁盤可用空間較低),可是此時應用程序仍是正常運行的日誌 |
ERROR |
因爲一個更嚴重的問題致使某些功能不能正常運行時記錄的信息 |
CRITICAL |
當發生嚴重錯誤,致使應用程序不能繼續運行時記錄的信息 |
開發應用程序或部署開發環境時,可使用DEBUG或INFO級別的日誌獲取儘量詳細的日誌信息來進行開發或部署調試;應用上線或部署生產環境時,應用使用WARNING或ERROR或CRITICAL級別的日誌來下降機器的I/O壓力和提升獲取錯誤日誌信息的效率。日誌級別的指定一般都是在應用程序的配置文件中進行指定的。
說明: ·上面列表中的日誌等級是從上到下依次升高的,即:DEBUG<INFO<WARNING<ERROR<CRITICAL,而日誌的信息量是依次減小的; ·當爲某個應用程序指定一個日誌級別後,應用程序會記錄全部日誌級別大於或等於指定日誌級別的日誌信息,而不是僅僅記錄指定級別的日誌信息,nginx、php等應用程序以及這裏要提升的python的logging模塊都是這樣的。一樣,logging模塊也能夠指定日誌記錄器的日誌級別,只有級別大於或等於該指定日誌級別的日誌記錄纔會被輸出,小於該等級的日誌記錄將會被丟棄。 |
logging模塊提供了兩種記錄日誌的方式:
·第一種方式是使用logging提供的模塊級別的函數
·第二種方式是使用logging日誌系統的四大組件
其實,logging所提供的模塊級別的日誌記錄函數也是對logging日誌系統相關類的封裝而已。
logging模塊定義的模塊級別的經常使用函數:
函數 |
說明 |
logging.debug(msg, *args, **kwargs) |
建立一條嚴重級別爲DEBUG的日誌記錄 |
logging.info(msg, *args, **kwargs) |
建立一條嚴重級別爲INFO的日誌記錄 |
logging.warning(msg, *args, **kwargs) |
建立一條嚴重級別爲WARNING的日誌記錄 |
logging.error(msg, *args, **kwargs) |
建立一條嚴重級別爲ERROR的日誌記錄 |
logging.critical(msg, *args, **kwargs) |
建立一條嚴重級別爲CRITICAL的日誌記錄 |
logging.log(msg, *args, **kwargs) |
建立一條嚴重級別爲level的日誌記錄 |
logging.basicConfig(msg, *args, **kwargs) |
對root logger進行一次性配置 |
其中logging.basicConfig(msg, *args, **kwargs)函數用於指定「要記錄的日誌級別」、「日誌格式」、「日誌輸出位置」、「日誌文件的打開模式」等信息,其餘幾個都是用於記錄各個級別日誌的函數。
logging模塊的四大組件:
組件 |
說明 |
loggers |
提供應用程序代碼直接使用的接口 |
handlers |
用於將日誌記錄發送到指定的目的位置 |
filters |
提供更細粒度的日誌過濾功能,用於決定哪些日誌記錄將會被輸出(其它的日誌記錄將會被忽略) |
formatters |
用於控制日誌信息的最終輸出格式 |
說明:logging模塊提供的模塊級別的那些函數實際上也是經過這幾個組件的相關實現類來記錄日誌的,只是在建立這些類的實例時設置了一些默認值。 |
回顧一下前面提到的幾個重要信息:
·能夠經過logging模塊定義的模塊級別的方法去完成簡單的日誌記錄
·只有級別大於或等於日誌記錄器指定級別的日誌記錄纔會被輸出,小於該級別的日誌記錄將會被丟棄。
1、最簡單的日誌輸出
先來試着分別輸出一條不一樣日誌級別的日誌記錄:
import logging logging.debug("這是一條「debug」級別的日誌信息!") logging.info("這是一條「info」級別的日誌信息!") logging.warning("這是一條「warning」級別的日誌信息!") logging.error("這是一條「error」級別的日誌信息!") logging.critical("這是一條「critical」級別的日誌信息!")
輸出結果:
WARNING:root:這是一條「warning」級別的日誌信息!
ERROR:root:這是一條「error」級別的日誌信息!
CRITICAL:root:這是一條「critical」級別的日誌信息!
2、那麼問題來了
問題1:爲何前面兩條日誌信息沒有被打印出來?
這是由於logging模塊提供的日誌記錄函數所使用的日誌器設置的默認級別是「WARNING」,所以只有「WARNING」級別的日誌記錄以及大於它的「ERROR」和「CRITICAL」級別的日誌記錄被輸出了,而小球它的「DEBUG」和「INFO」級別的日誌記錄被丟棄了。
問題2:打印出來的日誌信息中各字段表示什麼意思?爲何會這樣輸出?
上面輸出結果中每行記錄的各個字段含義分別是:
日誌級別:日誌器名稱:日誌內容
之因此會這樣輸出,是由於logging模塊提供的日誌記錄函數所使用的日誌設置的日誌格式默認是BASIC_FORMAT,其值爲:
"%(levelname)s:%(name)s:%(message)s"
問題3:爲何日誌記錄是打印到控制檯?
由於在logging模塊提供的日誌記錄函數所使用的日誌器設置的處理器所指定的日誌輸出位置默認爲「sys.stderr」。
問題4:怎麼修改這些默認設置?
在咱們調用上面這些日誌記錄函數以前,手動調用一些basicConfig()方法,把咱們想設置的內容以參數的形式傳遞進去就能夠了。
3、logging.basicConfig()函數說明
該方法用於logging日誌系統作一些基本配置,方法定義以下:
logging.basicConfig(**kwargs)
該函數可接收的關鍵字參數以下:
參數名稱 |
描述 |
filename |
指定日誌輸出目標文件的文件名,指定該設置薦後日志將不會輸出到控制檯了 |
filemode |
指定日誌文件的打開模式,默認爲'a'。須要注意的是,該選項要在filename指定時纔有效 |
format |
指定日誌格式字符串,即指定日誌輸出時所包含的字段信息以及它們的順序。logging模塊定義的格式字段下面會列出 |
detefmt |
指定日期/時間格式。須要注意的是,該選項要在format中包含時間字段%(asctime)s時纔有效 |
level |
指定日誌器的日誌級別 |
stream |
指定日誌輸出目錄stream,如sys.stdout、sys.stderr以及網絡stream。須要說明的是,stream和filename不能同時提供,不然會引起「ValueError」異常 |
sysle |
Python 3.2中新添加的配置項。指定format格式字符串的風格,可取值'%'、'{'和'$',默認爲'%' |
handlers |
Python 3.2中新添加的配置項。該選項若是被指定,它應該是一個建立了多個Handler的可迭代對象,這些handler將會被添加到rootlogger。須要說明的是:filename、stream和handlers這三個配置項只能有一個存在,不能同時出現2個或3個,不然會引起「ValueError」異常 |
4、logging模塊定義的格式字符串字段
咱們來列舉一下logging模塊中定義好的能夠用於format格式字符串中字段有哪些:
字段/屬性名稱 |
使用格式 |
描述 |
asctime |
%(asctime)s |
日誌事件發生的時間,如:2019-04-02 10:49:45,896 |
created |
%(created)f |
日誌事件發生的時間戳 |
relativeCreated |
%(relativeCreated)d |
日誌事件發生的時間相對於logging模塊加載時間的相對毫秒數 |
msecs |
%(msecs)d |
日誌事件發生事件的毫秒部分 |
levelname |
%(levelname)s |
該日誌記錄的文字形式的日誌級別(DEBUG、INFO、WARNING、ERROR、CRITICAL) |
levelno |
%(levelno)s |
該日誌記錄的數字形式的日誌級別(10、20、30、40、50) |
name |
%(name)s |
所使用的日誌器名稱,默認是「root」,由於默認使用的是rootLogger |
message |
%(message)s |
日誌記錄的文本內容 |
pathname |
%(pathname)s |
調用日誌記錄函數的源碼文件的全路徑 |
filename |
%(filename)s |
pathname的文件名部分,包含文件後綴 |
module |
%(module)s |
filename的名稱部分,不包含文件後綴 |
lineno |
%(lineno)d |
調用日誌記錄函數的源代碼所在的行號 |
funcName |
%(funcName)s |
調用日誌記錄函數的源代碼所在的行號 |
process |
%(process)d |
進程ID |
processName |
%(processName)s |
進程名稱 |
thread |
%(thread)s |
線程ID |
threadName |
%(threadName)s |
線程名稱 |
5、通過配置的日誌輸出
先簡單配置下日誌器的日誌級別
import logging logging.basicConfig( level=logging.DEBUG ) logging.debug("這是一條「debug」級別的日誌信息!") logging.info("這是一條「info」級別的日誌信息!") logging.warning("這是一條「warning」級別的日誌信息!") logging.error("這是一條「error」級別的日誌信息!") logging.critical("這是一條「critical」級別的日誌信息!")
輸出結果:
DEBUG:root:這是一條「debug」級別的日誌信息!
INFO:root:這是一條「info」級別的日誌信息!
WARNING:root:這是一條「warning」級別的日誌信息!
ERROR:root:這是一條「error」級別的日誌信息!
CRITICAL:root:這是一條「critical」級別的日誌信息!
全部等級的日誌信息都被輸出了,說明配置生效了。
在配置日誌器日誌級別的基礎上,配置下日誌輸出目標文件和日誌格式
import logging log_format = "%(asctime)s - %(levelname)s - %(message)s" logging.basicConfig( filename="log.log", level=logging.DEBUG, format=log_format ) logging.debug("這是一條「debug」級別的日誌信息!") logging.info("這是一條「info」級別的日誌信息!") logging.warning("這是一條「warning」級別的日誌信息!") logging.error("這是一條「error」級別的日誌信息!") logging.critical("這是一條「critical」級別的日誌信息!")
此時會發現控制檯中已經沒有輸出日誌內容,可是在python代碼文件的相同目錄下會生成一個名爲「log.log」的日誌文件,該文件中的內容爲:
2019-04-02 13:58:54,708 - DEBUG - 這是一條「debug」級別的日誌信息! 2019-04-02 13:58:54,737 - INFO - 這是一條「info」級別的日誌信息! 2019-04-02 13:58:54,737 - WARNING - 這是一條「warning」級別的日誌信息! 2019-04-02 13:58:54,737 - ERROR - 這是一條「error」級別的日誌信息! 2019-04-02 13:58:54,737 - CRITICAL - 這是一條「critical」級別的日誌信息!
在上面的基礎上,咱們再來設置下日期/時間格式
import logging log_format = "%(asctime)s - %(levelname)s - %(message)s" date_format = "%m/%d/%Y %H:%M:%S %p" logging.basicConfig( filename="log.log", level=logging.DEBUG, format=log_format, datefmt=date_format ) logging.debug("這是一條「debug」級別的日誌信息!") logging.info("這是一條「info」級別的日誌信息!") logging.warning("這是一條「warning」級別的日誌信息!") logging.error("這是一條「error」級別的日誌信息!") logging.critical("這是一條「critical」級別的日誌信息!")
此時會在「log.log」日誌文件中看到以下輸出內容:
04/02/2019 14:03:46 PM - DEBUG - 這是一條「debug」級別的日誌信息! 04/02/2019 14:03:46 PM - INFO - 這是一條「info」級別的日誌信息! 04/02/2019 14:03:46 PM - WARNING - 這是一條「warning」級別的日誌信息! 04/02/2019 14:03:46 PM - ERROR - 這是一條「error」級別的日誌信息! 04/02/2019 14:03:46 PM - CRITICAL - 這是一條「critical」級別的日誌信息!
掌握了上面的內容以後,已經可以知足咱們平時開發中須要的日誌記錄功能。