在上一篇文章 Python Logging 模組入門篇,模組介紹與基本用法 中,提到了Python logging的基本用法,而本篇會介紹logging的進階用法,怎麼使用logger,以及Log的儲存與備份,最後則是如何在multi-thread或multi-process的情境下使用logging
1. Logging Logger說明與用法
1.1 Logger 是什麼?
Logger是Logging提供的模組化操作,可以讓你新增刪除Handler,每個Handler可以有各自的格式、用途,例如A Handler可以發送Email,而B Handler可以將Log存至檔案,又或是讓Logger有階層式關係,例如A Logger是A1及A2 Logger的父Logger,則A1及A2的Log都會匯集至A Logger。
Logger是logging模組中的一個class,主要提供了四個方法
Logger.setLevel()
: 指定Logger處理的最低等級Logger.addHandler()
和Logger.removeHandler()
: 新增和移除處理器Logger.addFilter()
和Logger.removeFilter()
: 新增或移除過濾器setFormatter()
: 設定log的格式
1.2 Logger 範例
以下會示範,要如何建立一個logger,其中一個handler可以將log顯示在consoole上,顯示debug等級以上的log;另一個handler將log儲存至檔案,但只儲存等級info以上的log。
建立一個advanced.py,在其開頭載入模組,以及建立一個叫做advanced_logging的logger
建立兩個Handler,StreamHandler會將DEBUG等級以上的log輸出至console,FileHandler會將INFO等級以上的log輸出至advanced.log的檔案中,並設定兩個Handler的log格式都為formatter。
除了這兩種之外,官網還有提供許多功能的Handler
接著就可以開始蒐集應用程式的log
執行後,advanced.log內容為,console則多了一條DEBUG的log
完整程式碼
1.3 logger的階層
logging有支援階層式的logger,若今天建立了test的logger,test.run及test.go及test.go.gogo都是test的子孫
在logging中,子logger的log都會匯集到父logger,所以不需要再為子logger設定handler與format,只需要設定父logger的即可。以下是實際範例
銜接1.2的範例,在最下面新增
advanced_lib.py為
再次執行advanced.py後,會發現advanced.log多了以下的log
2. log 自動備份
開始使用log後,如果一直寫入Log而沒有清除的話,這個檔案遲早會占滿硬碟,因此限制檔案大小,以及自動備份,若超過指定數量則會自動刪除最舊的log。
若過往的Log需要保存,則可以自行撰寫Handler,保存前先壓縮是比較好的做法,因為Log都是文字,壓縮比相當高
自動備份Log只需要使用RotatingFileHandler即可,其中以下的maxBytes即是每個log檔案的大小上限,backupCoung則是會備份Log的數量。
執行後會產生總共六個檔案,最新到最舊分別是: rotatingfile及rotatingfile.1 ~ rotatingfile.5
每個檔案都會有一行log,而i = 13以前的log都不存在了
3. 在thread使用logging
在trhead使用logging與在模組中使用logging神似,可以善用format中的thread或threadName,更清楚的知道log是從哪個thread來的
4. 結論
謝謝各位讀者看到這裡,以上介紹了python logging的進階用法,希望對各位在做程式日誌上有幫助,如果想更清楚了解logging,可以到logging-cookbook ,內有許多我沒有介紹的進階範例,若之後有使用到也會在寫文章分享給大家
目前介紹的功能中,個人覺得自動備份的功能相當有幫助,因為我在公司建的Server就是Log越來越大,有bug或要查些資訊,都會等比較久XD
若你有任何覺得好用的套件或是任何建議,也歡迎您在下方留言告訴我以及分享給其他人唷
若你覺得文章對你很有幫助,歡迎在網頁右方填入你的email訂閱本站唷