logging模塊: logging是一個日誌記錄模塊,可以記錄我們日常的操作。 logging日誌文件寫入預設是gbk編碼格式的,所以在查看時需要使用gbk的解碼方式打開。 logging日誌等級:CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) ...
logging模塊:
logging是一個日誌記錄模塊,可以記錄我們日常的操作。
logging日誌文件寫入預設是gbk編碼格式的,所以在查看時需要使用gbk的解碼方式打開。
logging日誌等級:CRITICAL(50) > ERROR(40) > WARNING(30) > INFO(20) > DEBUG(10)
logging有函數式的和麵向對象的兩種方式。由於函數式的功能相對比較單一,不適合複雜的環境所以目前主要使用的是面向對象的logging下的方法。
logging預設顯示WARNING級別以上的日誌,信息如下:
import logging logging.debug("debug級別") logging.info("info級別") logging.warning("warning級別") logging.error("error級別") logging.critical("critical級別") # 列印內容如下,預設只列印WARNING級別以上。 WARNING:root:warning級別 ERROR:root:error級別 CRITICAL:root:critical級別
可以手動設置日誌級別,如下:
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
basicConfig()裡面有很多參數,參考如下:
參數名稱 |
描述 |
filename |
將日誌信息寫入文件中,指定該設置項後日誌信息就不會被輸出到控制台了 |
filemode |
指定日誌文件的打開模式,預設為'a'。需要註意的是,該選項要在filename指定時才有效 |
format |
指定日誌格式字元串,即指定日誌輸出時所包含的欄位信息以及它們的順序。logging模塊定義的格式欄位下麵會列出。 |
datefmt |
指定日期/時間格式。需要註意的是,該選項要在format中包含時間欄位%(asctime)s時才有效。 |
level |
指定日誌級別 |
stream |
指定日誌輸出目標stream,如sys.stdout、sys.stderr以及網路stream。需要說明的是,stream和filename不能同時提供,否則會引發 ValueError異常 |
style |
Python 3.2中新添加的配置項。指定format格式字元串的風格,可取值為'%'、'{'和'$',預設為'%' |
handlers |
Python 3.3中新添加的配置項。該選項如果被指定,它應該是一個創建了多個Handler的可迭代對象,這些handler將會被添加到root logger。需要說明的是:filename、stream和handlers這三個配置項只能有一個存在,不能同時出現2個或3個,否則會引發ValueError異常。 |
上面的時間需要使用format中包含時間段,過於format還有如下參數:
欄位/屬性名稱 |
使用格式 |
描述 |
asctime |
%(asctime)s |
日誌事件發生的時間--人類可讀時間,如:2003-07-08 16:49:45,896 |
created |
%(created)f |
日誌事件發生的時間--時間戳,就是當時調用time.time()函數返回的值 |
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 |
日誌記錄的文本內容,通過 msg % args計算得到的 |
pathname |
%(pathname)s |
調用日誌記錄函數的源碼文件的全路徑 |
filename |
%(filename)s |
pathname的文件名部分,包含文件尾碼 |
module |
%(module)s |
filename的名稱部分,不包含尾碼 |
lineno |
%(lineno)d |
調用日誌記錄函數的源代碼所在的行號 |
funcName |
%(funcName)s |
調用日誌記錄函數的函數名 |
process |
%(process)d |
進程ID |
processName |
%(processName)s |
進程名稱,Python 3.1新增 |
thread |
%(thread)d |
線程ID |
threadName |
%(thread)s |
線程名稱 |
下麵是一些基本的配置事例:
import logging FORMAT_DATA = format="%(asctime)s - %(name)s -[%(lineno)d] - %(message)s" logging.basicConfig(level=logging.DEBUG, format=FORMAT_DATA, filename="test.log", filemode="a+") logging.debug("我是DEBUG") logging.info("我是info") logging.warning("我是warning") logging.error("我是error") logging.critical("我是critical")
內容如下:
如果對format中asctime格式化的時間格式不滿意,可以使用basicConfig函數中的datefmt參數做調整,如下:
import logging FORMAT_DATA = format="%(asctime)s - %(name)s -[%(lineno)d] - %(message)s" DEFINE_TIME = "%Y/%m/%d %H:%M:%S" # 自定義時間格式 logging.basicConfig(level=logging.DEBUG, datefmt=DEFINE_TIME, format=FORMAT_DATA, filename="test.log", filemode="a+") logging.debug("我是DEBUG") logging.info("我是info") logging.warning("我是warning") logging.error("我是error") logging.critical("我是critical")
日誌文件內容如下:
發現日期改成了我們想要的格式。
下麵使用封裝後的logging寫日誌
使用logging類的步驟如下:
1、先創建一個日誌的對象
2、創建一個模板
3、創建輸出流(文件流,屏幕流兩種)
4、將流和模板綁定
5、將日誌和流進行綁定
6、使用日誌對象設置日誌等級
代碼如下:
import logging # 創建一個日誌對象 logg = logging.getLogger("測試日誌") # 定義一個模板 FORMATTER = logging.Formatter("%(asctime)s - %(name)s - [%(lineno)d] - %(message)s") # 創建一個屏幕流 p_stream = logging.StreamHandler() # 創建一個文件流 f_stream = logging.FileHandler("log.log",mode="a",encoding="utf-8")
# 將流綁定到模板 p_stream.setFormatter(FORMATTER) f_stream.setFormatter(FORMATTER)
# 將日誌和流進行綁定 logg.addHandler(p_stream) logg.addHandler(f_stream)
# 設置日誌記錄等級 logg.setLevel(logging.DEBUG) # 列印日誌信息 logg.debug("this is Debug") logg.info("this is info") logg.warning("this is warning") logg.error("this is error") logg.critical("this is critical")
# 列印內容如下 2019-02-18 19:32:54,393 - 測試日誌 - [23] - this is Debug 2019-02-18 19:32:54,393 - 測試日誌 - [24] - this is info 2019-02-18 19:32:54,393 - 測試日誌 - [25] - this is warning 2019-02-18 19:32:54,393 - 測試日誌 - [26] - this is error 2019-02-18 19:32:54,393 - 測試日誌 - [27] - this is critical
文件信息如下:
如果想為多個用戶創建不同的日誌,只需要創建流時創建不同的流即可,而不需要創建多個日誌對象,如果情況特殊考慮單獨在創建一個對象。其實我們可以在創建流的時候直接指定日誌等級。流的等級是優先於日誌對象的。如下我們創建兩個流:
import logging # 創建一個日誌對象 logg = logging.getLogger("測試日誌") # 創建一個程式員模板和老闆模板 CORE_FORMATTER = logging.Formatter("%(asctime)s - %(name)s - [%(lineno)d] - %(message)s") BOOS_FORMATTER = logging.Formatter("%(asctime)s - %(message)s") # 創建一個程式員的流和一個老闆的流 core_stream = logging.FileHandler("core.log",mode="a",encoding="utf-8") boos_stream = logging.FileHandler("boos.log",mode="a",encoding="utf-8") # 設置日誌等級(老闆的日誌等級設置WARNING) boos_stream.setLevel(logging.WARNING) # 將流綁定到模板 core_stream.setFormatter(CORE_FORMATTER) boos_stream.setFormatter(BOOS_FORMATTER) # 將日誌和流進行綁定 logg.addHandler(core_stream) logg.addHandler(boos_stream) # 設置日誌記錄等級 logg.setLevel(logging.DEBUG) # 列印日誌信息 logg.debug("this is Debug") logg.info("this is info") logg.warning("this is warning") logg.error("this is error") logg.critical("this is critical")
內容如下:
這樣我們便創建了兩種不同的日誌。好吧只討論到這裡吧,更多功能小伙伴們自己慢慢挖掘吧!!!