Flask设计API之Log使用

日志是一个程序必要的部分,它可以方便后期运维人员及时发现程序出现的错误,并及时修改代码。这里主要记录Flask API将错误信息进行日志记录。

日志模块

使用logging模块进行日志记录,封装初始化APP时,获取配置信息。

log.py

1
# -*- coding: UTF-8 -*-
2
__author__ = 'Joynice'
3
4
import logging
5
import os
6
import logging.handlers
7
8
# 1.创建1个logger:
9
lg = logging.getLogger("Error")
10
11
def init_log(app):
12
    log_path = app.config.get('LOG_PATH')
13
    try:
14
        if not os.path.exists(log_path):
15
            os.makedirs(log_path)
16
    except:
17
        print("创建日志目录失败")
18
        exit(1)
19
    if len(lg.handlers) == 0:  # 避免重复
20
        # 2.创建handler(负责输出,输出到屏幕streamhandler,输出到文件filehandler)
21
        filename = os.path.join(log_path, 'api.log')
22
        fh = logging.FileHandler(filename, mode="a", encoding="utf-8")  # 默认mode 为a模式,默认编码方式为utf-8
23
        sh = logging.StreamHandler()
24
        # 3.创建formatter:
25
        formatter = logging.Formatter(
26
            fmt='%(asctime)s - %(levelname)s - Model:%(filename)s - Fun:%(funcName)s - Message:%(message)s - Line:%(lineno)d')
27
        # 4.绑定关系:①logger绑定handler
28
        lg.addHandler(fh)
29
        lg.addHandler(sh)
30
        # # ②为handler绑定formatter
31
        fh.setFormatter(formatter)
32
        sh.setFormatter(formatter)
33
        # # 5.设置日志级别(日志级别两层关卡必须都通过,日志才能正常记录)
34
        lg.setLevel(40)
35
        fh.setLevel(40)
36
        sh.setLevel(40)

绑定app

将封装的init_log绑定在app上

1
def create_app():
2
    app = Flask(__name__)
3
    app.config.from_object(config.get('default'))
4
    db.init_app(app)
5
    register_blueprints(app)
6
    init_log(app=app)
7
    return app

AOP日志捕获

1
@app.errorhandler(Exception)
2
def framework_error(e):
3
    if isinstance(e, APIException):
4
        return e
5
    if isinstance(e, HTTPException):
6
        code = e.code
7
        msg = e.description
8
        success = False
9
        data = None
10
        return APIException(msg, code, data, success)
11
    else:
12
        # 调试模式
13
        lg.error(e)
14
        if not app.config['DEBUG']:
15
            return ServerError()
16
        else:
17
            raise e

注意Flask1.1版本后才能使用errorhandler捕获Exception,低版本只能捕获特定错误。