study_flask
--| apps
--| __init__.py
--| base
--| logger.py
--| __init__.py
--|app.py
1、base/looger.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)
def getLogHandlerConsole():
'1、日志格式'
formatter = logging.Formatter('[%(asctime)s][%(levelname)s][ %(funcName)s function: %(lineno)s line]:%(message)s')
'2、输出到控制台处理器'
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(formatter)
return console_handler
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 # 基于文件大小分割日志的方案
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, #保留旧文件数0
interval=1, #分割一次
encoding='utf-8') # 日志处理器
file_log_time_handler.setFormatter(formatter) # 日志格式
file_log_time_handler.setLevel(logging.DEBUG) # 日志等级
return file_log_time_handler # 基于文件大小分割日志的方案
#日志记录器
file_log = logging.getLogger('file_log')
file_log.setLevel(logging.DEBUG)
file_log.addHandler(getLogHandlerFile()) #添加文件日志处理器
file_log.addHandler(getLogHandlerConsole()) #添加控制台日志处理器
#日志记录器
time_log = logging.getLogger('time_log')
time_log.setLevel(logging.DEBUG)
time_log.addHandler(getLogHanderTime()) #添加时间日志处理器
time_log.addHandler(getLogHandlerConsole()) #添加控制台日志处理器
if __name__ == '__main__':
time_log.exception('时间处理器手动写')
file_log.exception('文件大小处理器手写')
2、在使用flask异常捕获装饰器进行捕获
app.py
from base.loggers import time_log,file_log
#使用异常处理模块,来捕获异常,记录到日志文件中
@app.errorhandler(Exception)
def handel_exception(e):
time_log.exception(f'time_handler,异常处理函数,{e}')
file_log.exception(f'file_handler,异常处理函数,{e}')
return jsonify({'code':500,'error':'系统内部报错'})
3、视图中手动写日志
from base.loggers import file_log,time_log
file_log.exception('file_handle的手动日志')
time_log.exception('time_handle的手动日志')
1、其他python框架,重写标题二内的2步骤,在全局异常处理函数中将异常信息记录到日志即可
2、python项目但是非框架,就得全部按照标题二的2步骤,在可能发生异常的代码块使用try except语句进行异常捕获,然后再写到日志文件中。