Flask python :logging日志功能使用

Flask python :logging日志功能使用

码农世界 2024-05-22 后端 99 次浏览 0个评论

logging日志的使用

      • 一、了解flask日志
        • 1.1、Loggers记录器
        • 1.2、Handlers 处理器
        • 1.3、Formatters 格式化器
        • 二、使用日志
          • 2.1、官网上的一个简单的示例
          • 2.2、基本配置
          • 2.3、具体使用示例
          • 2.4、运行
          • 三、写在最后

            一、了解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)
                      return redirect(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')
                  # setup config,导入配置,根据配置环境实例化
                  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)
              

              然后再每个模块需要的地方,再单独使用日志,比如我的蓝图中使用:

              Flask python :logging日志功能使用

              2.4、运行

              项目运行以后,访问我/api/posts,然后在文件storage/logs/blogin.log中,就能看到日志喽。

              这里一定要保证有这个目录,并且有写入文件的权限,否则会报错

              Flask python :logging日志功能使用

              三、写在最后

              宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介,是我靠谱的朋友在做)

              Flask python :logging日志功能使用

转载请注明来自码农世界,本文标题:《Flask python :logging日志功能使用》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,99人围观)参与讨论

还没有评论,来说两句吧...

Top