Python Logging 模組入門篇,模組介紹與基本用法

如果你在開發時還在使用print,請一定要試試 logging ,本篇會介紹為何要使用Logging,以及logging的基本用法、格式設定、跨模組日誌以及輸出至檔案。本篇的範例使用python版本為3.8。

1. 什麼是 logging ?

在學校剛接觸軟體開發時,當我們要知道程式跑到哪裡,變數現在的值是多少,我們都會使用print去印出來看,進行除錯。

但出了社會後,使用print會有許多困擾:

  1. print的時間點或是來源要自己寫在輸出字串內
  2. 輸出到檔案較麻煩,要自行用open打開一個檔案填寫
  3. print大量資料會造成效能降低,所以用完的print要自行刪除,或是將其註解
  4. 如果程式在多台Server同時運行,彙整這些log不容易

Python的 logging 可以滿足這些需求。

2. logging 基本用法

logging的Log有分五個等級,DEBUG等級最低,預設只記錄WARNING等級以上的Log

  • DEBUG: 開發時使用,產品上線後可以將其設定為不顯示
  • INFO: 用來確認程式目前執行到哪,在處理些什麼事情
  • WARNING: 用以顯示警告,如磁碟容量將不足,或收到異常資料等,不影響程式執行
  • ERROR: 顯示某些功能因為一些錯誤無法執行
  • CRITICAL: 用以顯示程式已經無法執行的訊息

接下來會從最基本的用法開始,加上各式各樣的功能

2.1 最簡單的使用方法

import logging

logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')

因預設等級為WARNING,故只會顯示WARNING、ERROR、CRITICAL的訊息,輸出結果:

WARNING:root:warn message
ERROR:root:error message
CRITICAL:root:critical message

2.2 基本設定

直接上程式範例,使用logging.basicConfig做基本設定

import logging
 
logging.basicConfig(filename='basic.log',  # logging to a file
                    level=logging.INFO,   # set level
                    # change format
                    format='%(asctime)s - %(levelname)s - %(message)s',
                    datefmt='%Y/%m/%d %I:%M:%S %p'
                    )
 
logging.debug('debug message')
logging.info('info message')
logging.warning('warn message')
logging.error('error message')
logging.critical('critical message')

給定filename參數,設定log輸出路徑,log都會輸出至指定的路徑,指定後terminal就不會輸出log,若要同時顯示log在terminal,請等待下篇文章介紹XD

給定level參數,共五種,分別是logging.DEBUG、logging.INFO、logging.WARNING、logging.ERROR、logging.CRITICAL,指定後,如前小節所說,只會輸出等級大於或等於設定的Log

給定format參數,可以客製化Log輸出的格式,asctime指的是Log產生的時間,levelname指的是log是屬於哪個等級,message則是log的訊息,還有許多可以設定的參數,請參考LogRecord attributes

給定datefmt參數,可以修改上述asctime的顯示的格式,使用方式與datetime內的時間格式相同,可以參考strftime() and strptime() Behavior

basic.log內輸出的結果

2022/06/12 04:53:22 PM - INFO - info message
2022/06/12 04:53:22 PM - WARNING - warn message
2022/06/12 04:53:22 PM - ERROR - error message
2022/06/12 04:53:22 PM - CRITICAL - critical message

2.3 從多個模組使用logging

若有多個模組,可以直接在模組內import logging,直接使用即可,直接上程式碼

main.py

import logging
import basic_lib
def main():

 

    logging.basicConfig(filename='basic.log',  # logging to a file
                        level=logging.INFO,   # set level

 

                        # change format
                        format='%(asctime)s - %(levelname)s - %(message)s',
                        datefmt='%Y/%m/%d %I:%M:%S %p'
                        )

 

    logging.info('Started')
    basic_lib.do_something()

 

    # logging variable data
    logging.info('Hello %s !!', 'world')
if __name__ == '__main__':
    main()

basic_lib.py

# mylib.py
import logging


def do_something():
    logging.info('Doing something')

輸出的結果 basic.log

2022/06/11 04:52:33 PM - INFO - Started
2022/06/11 04:52:33 PM - INFO - Doing something
2022/06/11 04:52:33 PM - INFO - Hello world !!

3. 結論

謝謝各位讀者看到這裡,以上介紹了python logging的基本用法,下一篇會再介紹logging的進階用法,包含

  1.  使用多個logger,讓log可以分類,各自儲存到不同的檔案、log Server或寄信至email信箱
  2. log自動備份,可以設定限制檔案大小,與備份數量,避免log過多塞爆硬碟
  3. multiple thread或multiple process使用log
 

若你有任何覺得好用的套件或是任何建議,也歡迎您在下方留言告訴我以及分享給其他人唷

若你覺得文章對你很有幫助,歡迎在網頁右方填入你的email訂閱本站唷

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。