日誌功能的實現 Python 自身提供了一個用於記錄日誌的標準庫模塊:logging。 logging 模塊 logging 模塊定義的函數和類為應用程式和庫的開發實現了一個靈活的事件日誌系統 logging 模塊是 Python 的一個標準庫模塊,由標準庫模塊提供日誌記錄 API 的關鍵好處是所有 ...
日誌功能的實現
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 會根據應用程式的調試狀態去調整日誌級別,如下圖: