日志功能的實現
Python 自身提供了一個用於記錄日志的標准庫模塊:logging。
logging 模塊
- logging 模塊定義的函數和類為應用程序和庫的開發實現了一個靈活的事件日志系統
- logging 模塊是 Python 的一個標准庫模塊,由標准庫模塊提供日志記錄 API 的關鍵好處是所有 Python 模塊都可以使用這個日志記錄功能。
logging 模塊的日志級別
- logging模塊默認定義了以下幾個日志等級,它允許開發人員自定義其他日志級別,但是這是不被推薦的,尤其是在開發供別人使用的庫時,因為這會導致日志級別的混亂。
- DEBUG 最詳細的日志信息,典型應用場景是 問題診斷
- INFO 信息詳細程度僅次於DEBUG,通常只記錄關鍵節點信息,用於確認一切都是按照我們預期的那樣進行工作
- WARNING 當某些不期望的事情發生時記錄的信息(如,磁盤可用空間較低),但是此時應用程序還是正常運行的
- ERROR 由於一個更嚴重的問題導致某些功能不能正常運行時記錄的信息
- FATAL/CRITICAL 整個系統即將/完全崩潰
- 開發應用程序或部署開發環境時,可以使用 DEBUG 或 INFO 級別的日志獲取盡可能詳細的日志信息來進行開發或部署調試;
- 應用上線或部署生產環境時,應該使用 WARNING 或 ERROR 或 CRITICAL 級別的日志來降低機器的I/O壓力和提高獲取錯誤日志信息的效率。
日志級別的指定通常都是在應用程序的配置文件中進行指定的。
logging 模塊的使用方式介紹
- loggers 提供應用程序代碼直接使用的接口
- handlers 用於將日志記錄發送到指定的目的位置
- filters 提供更細粒度的日志過濾功能,用於決定哪些日志記錄將會被輸出(其它的日志記錄將會被忽略)
- formatters 用於控制日志信息的最終輸出格式
# 設置日志的記錄等級 logging.basicConfig(level=logging.DEBUG) # 調試debug級 # 創建日志記錄器,指明日志保存的路徑、每個日志文件的最大大小、保存的日志文件個數上限 file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024*1024*100, backupCount=10) # 創建日志記錄的格式 日志等級 輸入日志信息的文件名 行數 日志信息 formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s') # 為剛創建的日志記錄器設置日志記錄格式 file_log_handler.setFormatter(formatter) # 為全局的日志工具對象(flask app使用的)添加日志記錄器 logging.getLogger().addHandler(file_log_handler)
使用logging提供的模塊級別的函數記錄日志
最簡單的日志輸出
- 先來試着分別輸出一條不同日志級別的日志記錄:
import logging logging.debug("This is a debug log.") logging.info("This is a info log.") logging.warning("This is a warning log.") logging.error("This is a error log.") logging.critical("This is a critical log.")
- 也可以這樣寫:
logging.log(logging.DEBUG, "This is a debug log.") logging.log(logging.INFO, "This is a info log.") logging.log(logging.WARNING, "This is a warning log.") logging.log(logging.ERROR, "This is a error log.") logging.log(logging.CRITICAL, "This is a critical log.")
修改配置改變輸出內容
logging.basicConfig(level=logging.DEBUG)
切記:設置
Configurations
中的 Working directory 為當前項目
集成日志到當前項目
- 在
config.py
文件中在不同的環境的配置下添加日志級別
class Config(object): ... # 默認日志等級 LOG_LEVEL = logging.DEBUG class ProductionConfig(Config): """生產模式下的配置""" LOG_LEVEL = logging.ERROR
- 在
info
目錄下的init.py
文件中添加日志配置的相關方法
def setup_log(config_name): """配置日志""" # 設置日志的記錄等級 logging.basicConfig(level=config[config_name].LOG_LEVEL) # 調試debug級 # 創建日志記錄器,指明日志保存的路徑、每個日志文件的最大大小、保存的日志文件個數上限 file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10) # 創建日志記錄的格式 日志等級 輸入日志信息的文件名 行數 日志信息 formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s') # 為剛創建的日志記錄器設置日志記錄格式 file_log_handler.setFormatter(formatter) # 為全局的日志工具對象(flask app使用的)添加日志記錄器 logging.getLogger().addHandler(file_log_handler)
- 在
create_app
方法中調用上一步創建的方法,並傳入config_name
def create_app(config_name): ... # 配置項目日志 setup_log(config_name) app = Flask(__name__) ...
- 在項目根目錄下創建日志目錄文件夾
logs
,如下: -
運行項目,當前項目日志已輸出到
logs
的目錄下自動創建的 log 文件中- 在 logs 文件夾下創建 .gitkeep 文件,以便能將 logs 文件夾添加到遠程倉庫,並在 .gitignore 文件中添加忽略提交生成的日志文件
logs/log*
在 Flask框架 中,其自己對 Python 的 logging 進行了封裝,在 Flask 應用程序中,可以以如下方式進行輸出 log:
current_app.logger.debug('debug') current_app.logger.error('error')
-
當前應用程序的 logger 會根據應用程序的調試狀態去調整日志級別,如下圖: