Flask学习笔记之日志操作配置实例讲解

 更新时间:2023年11月22日 11:16:42   作者:Hunter  
这篇文章主要为大家介绍了Flask学习笔记之日志操作配置实例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

之前在 Django 笔记里详细介绍了 logging 模块关于 formatters,handlers,loggers 等基础介绍,这里就不做多的介绍了,详情可以直接跳转查看相应文章:Django笔记三十之log日志的记录详解

这里直接介绍如何在 Flask 中配置日志信息。

本篇笔记的代码都已经提交到 github 上,可使用下面的操作获取代码:

git clone https://github.com/x1204604036/flask_backend.git

1、日志配置

首先,我们创建一些日志输出的文件地址变量,在 config/config.py 中记录,根据环境判断来源于测试环境变量文件或者生产环境变量文件,我这里是在 development.py 中,内容如下:

LOGGING_PATH = "e:/code/log_file/flask_backend/flask.log"
LOGGING_ERROR_PATH = "e:/code/log_file/flask_backend/flask_error.log"

接着在 app/config/ 文件夹下创建一个文件 logging_config.py,内容如下:

# app/config/logging_config.py
from app.config import config
LoggingConfig = {
    "version": 1,
    "formatters": {
        "verbose": {
            "format": "%(levelname)s %(asctime)s %(filename)s %(lineno)s %(message)s",
        }
    },
    "handlers": {
        "file": {
            "level": "INFO",
            "filename": config.LOGGING_PATH,
            "formatter": "verbose",
            "class": "logging.handlers.RotatingFileHandler",
            'maxBytes': 5 * 1024 * 1024,
            'backupCount': 20,
        },
        "error_handler": {
            "level": "INFO",
            "filename": config.LOGGING_ERROR_PATH,
            "formatter": "verbose",
            "class": "logging.handlers.RotatingFileHandler",
            'maxBytes': 5 * 1024 * 1024,
            'backupCount': 20,
        },
        "email_handler": {
            "level": "WARNING",
            "class": "logging.handlers.SMTPHandler",
            "mailhost": ("smtp.163.com", 25),
            "fromaddr": "hunterxxxxx@163.com",
            "toaddrs": "120xxxx@qq.com",
            "subject": "系统error",
            "credentials": ("hunterxxxx@163.com", "JBDMVIxxxxx"),
            "timeout": 20,
        },
    },
    "root": {
        "handlers": ["file"],
        "level": "INFO",
        "propagate": True,
    },
    "loggers": {
        "error_log": {
            "handlers": ["error_handler", "email_handler"],
            "level": "INFO",
        }
    }
}

这里创建了三个 handler,两个 FileHandler 将日志以文件形式存储,一个用于发送邮件

其下,root 表示用于记录 Flask 全部信息的输出,其他的 logger 都在 loggers 下记录,在这里一个记录 error 的 logger 对应有两个 handler,一个记录日志到文件,一个发送邮件。

在 app/__init__.py 中引入日志配置:

# app/__init__.py
import logging.config
from app.config import looging_config
def create_app():
    app = Flask(__name__)
    logging.config.dictConfig(looging_config.LoggingConfig)
    return app

2、日志打印示例

这里,我们以上一节中的异常处理为例进行日志记录,将日志输出的代码都放到异常处理中,exception_handler.py 内容如下:

from werkzeug.exceptions import HTTPException
from flask import jsonify, request
import logging
import traceback
logger = logging.getLogger("error_log")
ERROR_HTTP_CODE = 417
class UserException(Exception):
    def __init__(self, code=-1, msg="error", http_code=417):
        self.code = code
        self.msg = msg
        self.http_code = http_code
def init_error_exception(app):
    @app.errorhandler(HTTPException)
    def handler_http_exception(exception):
        trace_info = traceback.format_exc()
        log_msg = "request path: %s, traceback info: %s, description: %s" % (
            request.path, trace_info, exception.description
        )
        logger.info(log_msg)
        return jsonify({"code": -1, "msg": exception.description}), exception.code
    @app.errorhandler(Exception)
    def server_exception(exception):
        logger.info("request_path: " + request.path)
        trace_info = traceback.format_exc()
        log_msg = "request path: %s, traceback info: %s" % (request.path, trace_info)
        logger.info(log_msg)
        logger.error("系统报错信息:%s" % log_msg)
        return jsonify({"code": -1, "msg": "内部错误"}), ERROR_HTTP_CODE
    @app.errorhandler(UserException)
    def user_exception(exception):
        trace_info = traceback.format_exc()
        log_msg = "request path: %s, traceback info: %s, exception msg: %s" % (
            request.path, trace_info, exception.msg
        )
        logger.info(log_msg)
        return jsonify({"code": exception.code, "msg": exception.msg}), exception.http_code

这里,我们将请求路径,报错信息等放到 log_msg 中,然后通过 logger.info() 输出,另外,这里我们还尝试对系统异常的处理发送邮件到指定邮箱。

注意:日志配置中的邮箱信息记得改成自己实际的,这里我对我的信息做了模糊处理。

重新运行系统后,尝试触发这三种报错,就可以在对应的日志文件里看到错误信息的输出了,触发了 error 的第二种 exception 异常处理还会发送邮件。

以上就是Flask学习笔记之日志操作实例讲解的详细内容,更多关于Flask日志操作配置的资料请关注脚本之家其它相关文章!

相关文章

  • opencv python简易文档之图片基本操作指南

    opencv python简易文档之图片基本操作指南

    OpenCv除了可以获取图像之外,还可以对图像进行一下处理操作,下面这篇文章主要给大家介绍了关于opencv python简易文档之图片基本操作的相关资料,需要的朋友可以参考下
    2021-08-08
  • Python批量启动多线程代码实例

    Python批量启动多线程代码实例

    这篇文章主要介绍了python批量启动多线程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python eval()与exec()函数使用介绍

    Python eval()与exec()函数使用介绍

    exec函数执行的是python语句,没有返回值,eval函数执行的是python表达式,有返回值,exec函数和eval函数都可以传入命名空间作为参数,本文给大家介绍下Python eval()和exec()函数,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • python中偏函数partial用法实例分析

    python中偏函数partial用法实例分析

    这篇文章主要介绍了python中偏函数partial用法,实例分析了偏函数partial的功能、定义及使用方法,需要的朋友可以参考下
    2015-07-07
  • 深入浅析Python传值与传址

    深入浅析Python传值与传址

    这篇文章主要介绍了Python传值与传址的相关知识,包括传值与传址的区别介绍,需要的朋友可以参考下
    2018-07-07
  • 理解Django 中Call Stack机制的小Demo

    理解Django 中Call Stack机制的小Demo

    这篇文章主要介绍了理解Django 中Call Stack 机制的小Demo,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python海龟绘图详解

    Python海龟绘图详解

    python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),出现在1966年的Logo计算机语言。海龟绘图(turtle库)是python的内部模块,使用前导入即可。本文就带大家深入了解一下海龟绘图,快来跟随小编一起学习吧
    2021-12-12
  • 快速进修Python指南之函数进阶

    快速进修Python指南之函数进阶

    这篇文章主要为大家介绍了Java开发者快速进修Python指南之函数进阶示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Python Map 函数详解

    Python Map 函数详解

    这篇文章主要为大家介绍了Python Map 函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 使用Python来开发Markdown脚本扩展的实例分享

    使用Python来开发Markdown脚本扩展的实例分享

    这篇文章主要介绍了使用Python来开发Markdown脚本扩展的实例分享,文中的示例是用来简单地转换文档结构,主要为了体现一个思路,需要的朋友可以参考下
    2016-03-03

最新评论