前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask 学习-53.logging日志文件的使用

Flask 学习-53.logging日志文件的使用

作者头像
上海-悠悠
发布2022-09-13 15:45:16
1.8K0
发布2022-09-13 15:45:16
举报
文章被收录于专栏:从零开始学自动化测试

前言

Flask 使用标准 Python logging。有关 Flask 应用程序的消息使用 app.logger 记录

日志等级

一份日志配置由Loggers、Handlers、Filters、Formatters四部分组成。

Loggers 记录器

Loggers 即记录器,是日志系统的入口,日志等级描述了 logger 记录的信息的严重程度:

  • DEBUG:低的、基于调试目的的系统信息
  • INFO:一般系统消息
  • WARNING:警告信息
  • ERROR:发生了报错的信息
  • CRITICAL:发生了严重的问题的信息

当一条消息被发送到 logger,消息的等级会和 logger 的日志等级做一个比较,只有当消息的等级大于或等于 logger 的记录等级时,消息才会被当前 logger 进行更多的处理

Handlers 处理器

Handler即处理器,它的主要功能是决定如何处理logger中每一条消息,比如把消息输出到屏幕、文件或者Email中。和 logger 一样,handler也有级别的概念。 如果一条日志记录的级别不匹配或者低于handler的日志级别,则会被handler忽略。一个logger可以有多个handler,每一个handler可以有不同的日志级别。 这样就可以根据消息的重要性不同,来提供不同类型的输出。 例如,你可以添加一个handler把ERROR和CRITICAL消息发到你的Email,再添加另一个 handler把所有的消息(包括ERROR和CRITICAL消息)保存到文件里。

Filters 过滤器

Filter即过滤器。在日志记录从logger传到handler的过程中,使用Filter来做额外的控制。例如只允许某个特定来源的ERROR消息输出。 Filter还被用来在日志输出之前对日志记录做修改。例如当满足一定条件时,把日志记录从 ERROR 降到 WARNING 级别。 Filter在logger和handler中都可以添加;多个filter可以链接起来使用,来做多重过滤操作。

Formatters 格式化器

Formatter即格式化器,主要功能是确定最终输出的形式和内容。

简单示例

官网上的一个简单的示例

代码语言:javascript
复制
@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”。低于配置级别的任何内容都将不可见。

基本配置

此示例用于dictConfig()创建类似于 Flask 的默认配置的日志记录配置

代码语言:javascript
复制
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.

使用示例

以下是一个完整示例,dictConfig配置需在app之前

代码语言:javascript
复制
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()

log_file 指定保存日志的配置,保存到logs/flask.log 启动服务后,可以看到

2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!

本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00

报名费:报名费3000一人(周期3个月)

联系微信/QQ:283340479

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 日志等级
    • Loggers 记录器
      • Handlers 处理器
        • Filters 过滤器
          • Formatters 格式化器
          • 简单示例
          • 基本配置
          • 使用示例
            • 报名费:报名费3000一人(周期3个月)
              • 联系微信/QQ:283340479
              相关产品与服务
              日志服务
              日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档