一、項目結構
study_flask
??????? --| apps/
??????????????? --| __init__.py
??????? --| base/
??????????????? --| logger.py
??????????????? --| __init__.py
??????? --| app.py
二、配置日志功能
1、base/logger.py
import os
import logging
from datetime import datetime,date,timedelta
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
#項目根目錄
BASE_DIR = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
#日志文件存放的目錄
LOGS_DIR = os.path.join(BASE_DIR,'logs')
#使用RotatingFileHandler日志處理器,生成的日志文件存放的位置
FILE_LOGS_DIR = os.path.join(LOGS_DIR,'file_handler')
#使用TimedRotatingFileHandler日志處理器,生成的日志文件存放的位置
TIME_LOGS_DIR = os.path.join(LOGS_DIR,'time_handler')#創建logs目錄
if not os.path.exists(LOGS_DIR):os.makedirs(LOGS_DIR)
#創建logs/file_handler目錄
if not os.path.exists(FILE_LOGS_DIR):os.makedirs(FILE_LOGS_DIR)
#創建logs/time_handler目錄
if not os.path.exists(TIME_LOGS_DIR):os.makedirs(TIME_LOGS_DIR)#1、基于文件大小切割的日志處理器
def getLogHandlerFile():# 文件名,以日期作為文件名log_file_name = date.today().strftime('%Y-%m-%d.log')# 構建日志文件的路徑log_file_str = os.path.join(FILE_LOGS_DIR,log_file_name)'1、日志記錄格式'# 默認日志等級的設置# logging.basicConfig(level=logging.INFO)# 設置日志的格式:發生時間,日志等級,日志信息文件名, 函數名,行數,日志信息formatter = logging.Formatter('[%(asctime)s][%(levelname)s][%(pathname)s: %(funcName)s function: %(lineno)s line]: %(message)s')'2、基于文件的日志處理器配置'# 創建日志記錄器,指明日志保存路徑,每個日志的大小,保存日志的上限file_log_handler = RotatingFileHandler(filename=log_file_str, #日志文件名maxBytes=1024 * 1024 * 10, #文件大小超過10MB后,就會生成一個新的日志文件,日志就寫到新的文件中backupCount=10, #最大支持總的日志文件數encoding='UTF-8')file_log_handler.setFormatter(formatter) # 設置日志的格式file_log_handler.setLevel(logging.INFO) # 設置日志等級return file_log_handler # 基于文件大小分割日志的方案#2、基于時間切割的日志處理器
def getLogHanderTime():# 文件名,以日期作為文件名log_file_name = datetime.today().strftime('%Y-%m-%d-%H-%M.log')# 構建日志文件的路徑log_file_str = os.path.join(TIME_LOGS_DIR, log_file_name)'1、日志記錄的格式'# 默認日志等級的設置# logging.basicConfig(level=logging.DEBUG)# 設置日志的格式:發生時間,日志等級,日志信息文件名, 函數名,行數,日志信息formatter = logging.Formatter('[%(asctime)s][%(levelname)s][%(pathname)s: %(funcName)s function: %(lineno)s line]: %(message)s')'2、基于時間的日志處理器''''# 往文件里寫入指定間隔時間自動生成文件的Handler# 實例化TimedRotatingFileHandler# interval是時間間隔,backupCount是備份文件的個數,如果超過這個個數,就會自動刪除,when是間隔的時間單位,單位有以下幾種:# S 秒# M 分# H 小時# D 天# 'W0'-'W6' 每星期(interval=0時代表星期一:W0)# midnight 每天凌晨'''file_log_time_handler = TimedRotatingFileHandler(filename=log_file_str, #日志文件的路徑when='midnight', #凌晨零點進行文件分割backupCount=0, #保留舊文件數0interval=1, #分割一次encoding='utf-8') # 日志處理器file_log_time_handler.setFormatter(formatter) # 日志格式file_log_time_handler.setLevel(logging.DEBUG) # 日志等級return file_log_time_handler # 基于文件大小分割日志的方案if __name__ == '__main__':from flask import current_appcurrent_app.logger.error('手動寫日志時')
2、apps/__init__.py
from base.loggers import getLogHanderTime,getLogHandlerFile
import logging
from flask import Flaskdef create_app():#創建一個flask實例,傳遞__name__ ,是把當前文路徑作為flask實例的根路徑#static和templates都是創建在該路徑下的app = Flask(__name__,static_folder='../static',template_folder='../templates') #static目錄位置是上層的static'基本配置''日志使用'app.logger.addHandler(getLogHanderTime())app.logger.addHandler(getLogHandlerFile())app.logger.setLevel(logging.DEBUG)return app
三、測試使用
1、在視圖中使用
from flask import current_app
current_app.logger.error('手動寫日志時')
2、在視圖中拋出一個異常
四、日志文件
基于文件大小分割的日志文件路徑: logs/file_handler/年-月-日.log
基于時間間隔分割的日志文件路徑:logs/time_handler/年-月-日.log