找回密码
 会员注册
查看: 27|回复: 0

Flaskpython:logging日志功能使用

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-3 14:44:22 | 显示全部楼层 |阅读模式
logging日志的使用一、了解flask日志1.1、Loggers记录器1.2、Handlers处理器1.3、Formatters格式化器二、使用日志2.1、官网上的一个简单的示例2.2、基本配置2.3、具体使用示例2.4、运行三、写在最后一、了解flask日志日志是一种非常重要的工具,可以帮助开发人员在应用程序中进行故障排除和错误调试。Flask应用程序的记录器可以记录应用程序的运行状态和错误,从而提供有价值的信息来分析和解决问题。Flask采用标准Pythonlogging.有关Flask应用程序的消息记录在app.logger中,Flask日志基本配置文档,在文档中了解到,在Flask中,我们可以使用app.logger对象来进行日志记录。Flask采用标准Pythonlogging.有关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'])deflogin():user=get_user(request.form['username'])ifuser.check_password(request.form['password']):login_user(user)app.logger.info('%sloggedinsuccessfully',user.username)returnredirect(url_for('index'))else:app.logger.info('%sfailedtologin',user.username)abort(401)1234567891011如果不配置日志记录,Python的默认日志级别通常为“warning”。低于配置级别的内容将不可见2.2、基本配置当你想为项目配置日志记录时,应该在程序启动时尽快进行。如果在配置日志之前访问,那么app.logger就会成为缺省记录器。如果可能,请在创建应用程序对象之前配置日志记录。此示例使用dictConfig()来创建一个类似于Flask缺省配置的日志记录配置:fromlogging.configimportdictConfigdictConfig({'version':1,'formatters':{'default':{'format':'[%(asctime)s]%(levelname)sin%(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__)12345678910111213141516171819如果没有自己配置日志,Flask会自动添加一个StreamHandler到app.logger。在请求过程中,它会写到由WSGI服务器指定的,保存在environ['wsgi.errors']变量中的日志流(通常是sys.stderr)中。在请求之外,则会记录到sys.stderr。2.3、具体使用示例fromflaskimportFlask,requestfromlogging.configimportdictConfigdictConfig({"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'])deflogin():app.logger.debug(f'loginrequestpayload:{request.json}')user=request.json.get('username')ifuser=='test':app.logger.info(f'{user}loggedinsuccessfully')return{'msg':'success!','access_token':'********token******'}else:app.logger.info('%sfailedtologin',user.username)return{'msg':'usernameorpasswordinvalid','access_token':''}if__name__=='__main__':app.run()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556可以再精简一下,把日志的处理单独拉出来:importosfromflaskimportFlaskfromproject.extensionimportdb,corsfromproject.configimportconfig#导入存储配置的字典fromproject.blogimportblog_base_blueprintimportloggingfromlogging.handlersimportRotatingFileHandlerdefcreate_app(config_name=None):ifconfig_nameisNone: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)returnapp#注册flask拓展defregister_extension(app:Flask):db.init_app(app)db.app=appcors.init_app(app,origins="*")#注册蓝图defregister_blueprint(app:Flask):app.register_blueprint(blog_base_blueprint)defregister_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)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051然后再每个模块需要的地方,再单独使用日志,比如我的蓝图中使用:2.4、运行项目运行以后,访问我/api/posts,然后在文件storage/logs/blogin.log中,就能看到日志喽。这里一定要保证有这个目录,并且有写入文件的权限,否则会报错三、写在最后宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介,是我靠谱的朋友在做)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 13:35 , Processed in 0.380417 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表