当前位置: 首页 > news >正文

Flask 3.x log全域配置(包含pytest)

最近使用到flask3.x,配置了全域的log,这边记录下

首先需要创建logging的配置文件,我是放在项目根目录的,

Logging 配置 

logging.json 

{"version": 1,  # 配置文件版本号"formatters": {"default": {"format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s"# 默认的日志格式,包含时间、日志级别、模块和消息}},"handlers": {"console": {"class": "logging.StreamHandler",# 日志处理器的类,将日志输出到控制台"level": "DEBUG",  # 控制台处理器的日志级别为 DEBUG"formatter": "default",  # 使用上面定义的 "default" 格式化器"stream": "ext://sys.stdout"  # 输出流为标准输出流},"file": {"class": "logging.handlers.RotatingFileHandler",# 日志处理器的类,将日志输出到文件"level": "INFO",  # 文件处理器的日志级别为 INFO"formatter": "default",  # 使用上面定义的 "default" 格式化器"filename": "logs/log",  # 日志文件的名称(logs 目录下的 log 文件)"maxBytes": 10485760,  # 每个日志文件的最大大小为 10 MB"backupCount": 20,  # 保留最近 20 个日志文件备份"encoding": "utf8"  # 使用 UTF-8 编码}},"root": {"level": "DEBUG",  # 根日志记录器的级别为 DEBUG"handlers": ["console", "file"]# 根日志记录器使用上面定义的 "console" 和 "file" 两个处理器}
}

application.py

然后在application.py中加载logging.json,并且用dictConfig加载到logging的配置中。

这里使用../logging.json是因为我的logging.json是在application.py的上一层,具体放的值,要参考具体的路径来配置

"""Application module."""from logging.handlers import RotatingFileHandler
import os
from flask import Flask
from flask_bootstrap import Bootstrap
from main.web.route.views import xxx_bp
from main.containers import Container
from logging.config import dictConfig
import jsondef create_app() -> Flask:app = Flask(__name__,template_folder='webapp/templates',static_folder='webapp/content')container = Container()init_config_log()app.register_blueprint(xxx_bp,url_prefix='/xxx')app.container = containerbootstrap = Bootstrap()bootstrap.init_app(app)return appdef init_config_log() -> None:with open(os.path.join(os.path.dirname(__file__), "../logging.json")) as f:logging_config = json.load(f)dictConfig(logging_config)

使用的时候就直接使用current_app.logger打印就可以了 


from flask import current_app
class xxxxxService:def __init__(self,...) -> None:...def test_log(self) -> None:current_app.logger.error("Log something....")

 还有记得根据你logging.json配置的filename建立他的父文件夹,对于我的配置就是建立logs文件夹,否则启动项目的时候就会报错:

 并且所有的log也会被记录到配置的filename的文件里面。

pytest

pytest中有自己独立的log,但是如果加载了app,类似于这种

import datetime
import pytest
from main.application import create_app
from flask import current_app@pytest.fixture
def app():app = create_app()app.config.update({"TESTING": True,})yield app@pytest.fixture
def xxxx_service(app):with app.app_context():xxxx_repo=xxxxRepositoryImpl()yield xxxService(xxxx_repo=xxxx_repo)# yield UserService(user_repository=user_repo,session_factory=db.session)def test_create_user(xxxx_service):current_app.logger.info("Log Something")xxx=xxxx_service.xx_function()assert xxx == "some value"

就会导致Flask应用程序和pytest都使用了logging模块,但是它们的log配置是独立的,不会相互覆盖。当在Flask中配置了log后,Flask会创建一个名为flask.app的logger对象,并将其添加到logging模块的logger列表中。当在pytest中使用log对象时,您实际上是使用了logging模块的root logger对象,它是默认的logger对象。由于Flask的logger对象的级别高于root logger对象的级别,所以Flask的logger对象会拦截root logger对象的日志消息,导致pytest中的log不打印。

所以呢,我们就统一使用current_app.logger,这种方式打印log。

但是这样会有一个问题,log会被正常记录,也会被放在tests/${filename}中(因为是test中会生成独立的${filename},记得也要提前创建父文件夹),但是console中没有log打印。
这种情况下,就需要修改我们的pytest.ini,如果没有的话,就需要在根目录中新建一个,
这里面的配置是显示

pytest.ini

[pytest]
addopts = -s
#addopts 是一个配置项,用于指定传递给 pytest 的额外命令行选项。
#-s 是 pytest 的一个命令行选项,表示禁用输出捕获,允许测试中的 print 语句将输出直接打印到控制台。
#因此,这个配置告诉 pytest 在运行时使用 -s 选项,使得测试中的输出能够直接显示在终端上,而不是被 #pytest 捕获并隐藏。这在调试和查看详细信息时很有用。 

 加上这个之后,print也会被显示在console,当然也包括我们的log。

之后就可以运行pytest了,不管是我们业务代码中的log,还是test中的log,都会根据我们log的配置打印在console里面,也会记录到test/${filename}中。

http://www.lryc.cn/news/285885.html

相关文章:

  • 枚举算法(穷举法)(暴力法)
  • 计算机网络学习The next day
  • ffmpeg中AVFrame解码linesize确定
  • 数据可视化 | 期末复习 | 补档
  • 【Docker】使用Docker安装Nginx及部署前后端分离项目应用
  • 28、web攻防——通用漏洞SQL注入HTTP头XFFCOOKIEPOST请求
  • c++:类和对象(1),封装
  • 三、安全工程—安全架构(CISSP)
  • Linux:shell脚本:基础使用(9)《数组》
  • TCP高并发服务器简介(select、poll、epoll实现与区别)
  • Linux中的软件包管理器yum
  • 如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试
  • 解决子元素的click事件会触发父元素的dbclick事件
  • 算法训练营Day38(动态规划1)
  • 基于Harris角点的多视角图像全景拼接算法matlab仿真
  • 数学建模--PageRank算法的Python实现
  • samba服务搭建,并将共享目录映射到windows
  • golang 中使用 statik 将静态资源编译进二进制文件中
  • 北京住总集团携手云轴科技ZStack获行业云平台领航者创新实践奖
  • 【漏洞攻击之文件上传条件竞争】
  • Buttton样式设置background属性失效的问题
  • 使用vue-pdf插件加载pdf
  • BP蓝图映射到C++笔记1
  • 龙芯+RT-Thread+LVGL实战笔记(30)——电子琴演奏
  • Python Process创建进程(2种方法)详解
  • 树莓派4B 使用树莓派官方烧录器烧录ubuntu20.04.5 排坑
  • 鸿蒙开发(五)鸿蒙UI开发概览
  • 应用层—HTTP详解(抓包工具、报文格式、构造http等……)
  • ISA Server 2006部署网站对比nginx
  • CHAPTER 9: 《DESIGN A WEB CRAWLER》第9章 《设计一个web爬虫》