日志是一个程序必要的部分,它可以方便后期运维人员及时发现程序出现的错误,并及时修改代码。这里主要记录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 |
|
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,低版本只能捕获特定错误。