当前位置: 首页 > 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}中。

相关文章:

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

最近使用到flask3.x,配置了全域的log,这边记录下 首先需要创建logging的配置文件,我是放在项目根目录的, Logging 配置 logging.json {"version": 1, # 配置文件版本号"formatters": {"default&qu…...

枚举算法(穷举法)(暴力法)

1.什么是枚举 枚举是指在一定范围内将所有情况一一列举,再通过条件判断得到自己想要的答案; 2.枚举核心 3.使用枚举的基本步骤 4.例题 4.1.我国古代数学家张丘建在他的《算经》一书中提出了著名的“百钱买百鸡”问题:鸡翁一值钱五;鸡母一值钱三;鸡雏三…...

计算机网络学习The next day

在计算机网络first day中,我们了解了计算机网络这个科目要学习什么,因特网的概述,三种信息交换方式等,在今天,我们就来一起学习一下计算机网络的定义和分类,以及计算机网络中常见的几个性能指标。 废话不多…...

ffmpeg中AVFrame解码linesize确定

一 测试环境 机型:Intel(R) Xeon(R) Gold 5218 ffmpeg版本4.3-dev 解码视频分辨率 720x1280 , 解码后 AVFrame linesize 768 解码视频分辨率 480x640, 解码后AVFrame linesize 512 二 linesize计算过程 avcodec_default_get_buffer2 -->update_frame_pool() --&g…...

数据可视化 | 期末复习 | 补档

文章目录 📚介绍可视化🐇什么是可视化🐇科学可视化,信息可视化,可视分析系统三者之间有什么区别🔥🐇可视化的基本流程🐇可视化的两个基本设计原则🐇数据属性&#x1f407…...

【Docker】使用Docker安装Nginx及部署前后端分离项目应用

一、Nginx介绍 Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。它是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,公开版本1.19.6发布于2020年12月15日。其将源代码以类BSD许可证的形式发布,因它…...

28、web攻防——通用漏洞SQL注入HTTP头XFFCOOKIEPOST请求

文章目录 $_GET:接收get请求,传输少量数据,URL是有长度限制的; $_POST:接收post请求; $_COOKIE:接收cookie,用于身份验证; $_REQUEST:收集通过 GET 、POST和C…...

c++:类和对象(1),封装

C面向对象的三大特性:封装、继承、多态。 封装 封装的意义一: 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 类中的属性和行为,我们统一称为成员 属性也叫: 成员属性 成员变量 行为也叫&a…...

三、安全工程—安全架构(CISSP)

目录 一、安全工程 1.企业安全架构与系统安全架构 2.通用企业架构框架 2.1 Zachman框架...

Linux:shell脚本:基础使用(9)《数组》

数组就是一组数据类型相同集合 定义 数组名(元素内容…………) 如果没有元素内容就是空 arr1() # 定义了一个空数组 arr2(1 2 3 4 5 6 ) # 定义了一个元素是整形的数组 arr3("hello" "world" "你好" "世界") # 定义了一个元素为字符…...

TCP高并发服务器简介(select、poll、epoll实现与区别)

select、poll、epoll三者的实现: select实现TCP高并发服务器的流程: 一、创建套接字(socket函数):二、填充服务器的网络信息结构体:三、套接字和服务器的网络信息结构体进行绑定(bind函数&…...

Linux中的软件包管理器yum

目录 1.什么是软件包 2.关于 rzsz 3.查看软件包 4.如何安装软件 5.如何卸载软件 1.什么是软件包 ● 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. ● 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理…...

如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂&#xff…...

解决子元素的click事件会触发父元素的dbclick事件

解决子元素的click事件会触发父元素的dbclick事件 方案一:方案二:方案三:方案一方案二综合案例如下: 方案一: 错误思路:通过阻止子元素click事件的冒泡,阻止父元素的dbclick 正确思路&#xff…...

算法训练营Day38(动态规划1)

动态规划理论基础 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 区别 动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心&…...

基于Harris角点的多视角图像全景拼接算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Harris角点检测 4.2 图像配准 4.3 图像变换和拼接 4.4 全景图像优化 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 function [ImageB…...

数学建模--PageRank算法的Python实现

文章目录 1. P a g e R a n k PageRank PageRank算法背景2. P a g e R a n k PageRank PageRank算法基础2.1. P a g e R a n k PageRank PageRank问题描述2.2.有向图模型2.3.随机游走模型 3. P a g e R a n k PageRank PageRank算法定义3.1. P a g e R a n k PageRank PageRank…...

samba服务搭建,并将共享目录映射到windows

系统版本:centos7 1、centos 安装samba yum -y install samba 2、查看安装信息 rpm -qa |grep samba 3、设置开机自启动 systemctl enable smb.service systemctl enable nmb.service 4、设置samba服务器配置文件 sudo vi /etc/samba/smb.conf 注意&#…...

golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发…...

北京住总集团携手云轴科技ZStack获行业云平台领航者创新实践奖

为进一步促进行业企业上云、用数、赋智发展,落实国家政策,加速云计算应用从互联网拓展至政务、金融、交通、电信等行业,推动以云计算为核心的数字产业创新,1月18日中国信息通信研究院主办的“企业上云用云专项行动会—行业云平台研…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

flow_controllers

关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...