[Python] 使用 Logger 有效率地記錄生產模式下的異常行為

#Python, #logging

作為工程師在進行開發時,我們會透過邏輯條件盡可能擋掉相關異常行為,針對無法具體定義的條件,則會透過例外處理的方式試圖攔截可能的例外情況。不可否認的是即便這個網子在怎麼密集,還是會有漏網之魚,特別這些問題可能又出現在實際的生產環境下,這時候 Logger 便扮演重要的角色,可以適當的把這些操作給記錄下來,甚至是例外或是異常資訊。

Python 跟其他的程式語言一樣,具備原生套件處理這類型的應用需求,調用起來也相當簡單。

import logging
logging.basicConfig(filename='app.log', encoding='utf-8', level=logging.INFO)
logging.debug('This message should go to the log file')
logging.info('App was started')
logging.warning('There is an warning')
logging.error('There is an error')

很快就會注意到一個問題,我知道事情發生的順序,但我不知道發生問題的時間。這時候你就可以這樣調整:

logging.basicConfig(format='%(asctime)s%(levelname)s:%(message)s', level=logging.INFO)

關鍵就在於’format’,補上時間格式就能清楚記錄這些資訊,例如:

2023-08-22 15:33:03,162 - INFO - Start the app

接著作為有經驗的工程師,相信很快就會容易到一個問題: 假設隨著時間越來越長,這個 log 檔案會不會多到不容易閱讀?
沒錯,這是個大問題,很直覺的想法就是依照檔案大小限制或是時間作適當的切割。但使用時間做切割也有一個缺點: 如果問題發生與處理時間太長,這些紀錄可能會丟失。看起來從檔案容量大小來做會是比較實際的作法。當然這些Logger這個套件也想到,我們可以透過RotatingFileHandler來處理。

import logging
from logging.handlers import RotatingFileHandler
logger = logging.getLogger('Vajra Dashboard')
logger.setLevel(logging.INFO)

handler = RotatingFileHandler('app.log', maxBytes=1e6, backupCount=5) # 1 MB大小,保留5個檔案
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info('Start the app')

這樣就可以輕鬆達到上述目的了。善用這下技術到自己後續的專案上,對於故障排除無疑添上一把利劍。

發佈留言