logging日志的使用
一、了解flask日志
日志是一种非常重要的工具,可以帮助开发人员在应用程序中进行故障排除和错误调试。Flask应用程序的记录器可以记录应用程序的运行状态和错误,从而提供有价值的信息来分析和解决问题。
Flask采用标准 Python logging . 有关Flask应用程序的消息记录在
app.logger
中,
Flask日志基本配置文档 ,在文档中了解到,在 Flask 中,我们可以使用 app.logger 对象来进行日志记录。Flask采用标准 Python logging . 有关Flask应用程序的消息记录在
app.logger
中
1.1、Loggers记录器
Loggers 即记录器,是日志系统的入口,日志等级描述了 logger 记录的信息的严重程度:
- DEBUG:低的、基于调试目的的系统信息
- INFO:一般系统消息
- WARNING:警告信息
- ERROR:发生了报错的信息
- CRITICAL:发生了严重的问题的信息 当一条消息被发送到 logger,消息的等级会和 logger 的日志等级做一个比较,只有当消息的等级大于或等于 logger 的记录等级时,消息才会被当前 logger 进行更多的处理
1.2、Handlers 处理器
Handler即处理器,它的主要功能是决定如何处理logger中每一条消息,比如把消息输出到屏幕、文件或者Email中。和 logger 一样,handler也有级别的概念。
如果一条日志记录的级别不匹配或者低于handler的日志级别,则会被handler忽略。
一个logger可以有多个handler,每一个handler可以有不同的日志级别。
这样就可以根据消息的重要性不同,来提供不同类型的输出。
例如,你可以添加一个handler把ERROR和CRITICAL消息发到你的Email,再添加另一个 handler把所有的消息(包括ERROR和CRITICAL消息)保存到文件里。
1.3、Formatters 格式化器
Formatter即格式化器,主要功能是确定最终输出的形式和内容。
二、使用日志
2.1、官网上的一个简单的示例
@app.route('/login', methods=['POST'])
def login():
user =get_user(request.form['username'])if user.check_password(request.form['password']):login_user(user)
app.logger.info('%s logged in successfully', user.username)returnredirect(url_for('index'))else:
app.logger.info('%s failed to log in', user.username)abort(401)
如果不配置日志记录,Python的默认日志级别通常为“warning”。低于配置级别的内容将不可见
2.2、基本配置
当你想为项目配置日志记录时,应该在程序启动时尽快进行。如果在配置日志之前访问,那么 app.logger 就会成为缺省记录器。如果可能,请在创建应用程序对象之前配置日志记录。
此示例使用 dictConfig() 来创建一个类似于 Flask 缺省配置的日志记录配置:
from logging.config import dictConfig
dictConfig({'version':1,'formatters':{'default':{'format': '[%(asctime)s]%(levelname)s in %(module)s:%(message)s',}},'handlers':{'wsgi':{'class':'logging.StreamHandler','stream': 'ext://flask.logging.wsgi_errors_stream','formatter':'default'}},'root':{'level':'INFO','handlers':['wsgi']}})
app =Flask(__name__)
如果没有自己配置日志,Flask 会自动添加一个
StreamHandler
到
app.logger
。 在请求过程中,它会写到由
WSGI
服务器指定的,保存在
environ['wsgi.errors']
变量中的日志流(通常是
sys.stderr
)中。在请求之外,则会记录到
sys.stderr
。
2.3、具体使用示例
from flask import Flask, request
from logging.config import dictConfig
dictConfig({"version":1,"disable_existing_loggers": False, # 不覆盖默认配置
"formatters":{ # 日志输出样式
"default":{"format":"%(asctime)s - %(name)s - %(levelname)s - %(message)s"}},"handlers":{"console":{"class":"logging.StreamHandler", # 控制台输出
"level":"DEBUG","formatter":"default",},"log_file":{"class":"logging.handlers.RotatingFileHandler","level":"INFO","formatter":"default", # 日志输出样式对应formatters
"filename":"./logs/flask.log", # 指定log文件目录
"maxBytes":20*1024*1024, # 文件最大20M
"backupCount":10, # 最多10个文件
"encoding":"utf8", # 文件编码
},},"root":{"level":"DEBUG", # # handler中的level会覆盖掉这里的level
"handlers":["console","log_file"],},})
app =Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
app.logger.debug(f'login request payload:{request.json}')
user = request.json.get('username')if user =='test':
app.logger.info(f'{user} logged in successfully')return{'msg':'success!','access_token':'********token******'}else:
app.logger.info('%s failed to log in', user.username)return{'msg':'username or password invalid','access_token':''}if __name__ =='__main__':
app.run()
可以再精简一下,把日志的处理单独拉出来:
import os
from flask import Flask
from project.extension import db, cors
from project.config import config # 导入存储配置的字典
from project.blog import blog_base_blueprint
import logging
from logging.handlers import RotatingFileHandler
def create_app(config_name=None):if config_name is None:
config_name = os.getenv('FLASK_ENV','development') # 从环境变量中获取FLASK_ENV,并设置默认值
app =Flask('project')#setupconfig,导入配置,根据配置环境实例化
app.config.from_object(config[config_name])
# 注册扩展
register_extension(app)
# 注册蓝图
register_blueprint(app)
#注册日志处理器
register_log(app)return app
# 注册flask拓展
def register_extension(app: Flask):
db.init_app(app)
db.app = app
cors.init_app(app, origins="*")
# 注册蓝图
def register_blueprint(app: Flask):
app.register_blueprint(blog_base_blueprint)
def register_log(app: Flask):
app.logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s -%(name)s -%(levelname)s -%(message)s')
file_handler =RotatingFileHandler(app.config['BASE_DIR']+'/storage/logs/blogin.log', maxBytes=10*1024*1024, backupCount=10)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
然后再每个模块需要的地方,再单独使用日志,比如我的蓝图中使用:
2.4、运行
项目运行以后,访问我
/api/posts
,然后在文件
storage/logs/blogin.log
中,就能看到日志喽。
这里一定要保证有这个目录,并且有写入文件的权限,否则会报错
三、写在最后
宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介,是我靠谱的朋友在做)
版权归原作者 ignativs amor 所有, 如有侵权,请联系我们删除。