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…...
数据可视化 | 期末复习 | 补档
文章目录 📚介绍可视化🐇什么是可视化🐇科学可视化,信息可视化,可视分析系统三者之间有什么区别🔥🐇可视化的基本流程🐇可视化的两个基本设计原则🐇数据属性🐇…...
【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. 测试使用固定二级子域名访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂ÿ…...
解决子元素的click事件会触发父元素的dbclick事件
解决子元素的click事件会触发父元素的dbclick事件 方案一:方案二:方案三:方案一方案二综合案例如下: 方案一: 错误思路:通过阻止子元素click事件的冒泡,阻止父元素的dbclick 正确思路ÿ…...
算法训练营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日中国信息通信研究院主办的“企业上云用云专项行动会—行业云平台研…...
WindowResizer终极指南:5分钟掌握Windows窗口强制调整技巧
WindowResizer终极指南:5分钟掌握Windows窗口强制调整技巧 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的Windows应用程序窗口而烦恼吗?无…...
NodeJS-Learning包管理艺术:npm高级用法与私有仓库搭建
NodeJS-Learning包管理艺术:npm高级用法与私有仓库搭建 【免费下载链接】NodeJS-Learning This page contains collection of curated links to blog posts, articles, videos, tutorials, books, frameworks, modules, IDEs, testing tools, hosting providers, et…...
整合ssm框架,详细讲解
今天针对 SSM(SpringSpringMVCMyBatis)框架整合展开了学习,学习内容如下:我们在进行 JavaEE 开发时,为了实现解耦和提高开发效率,通常会采用 SSM(SpringSpringMVCMyBatis)框架整合的…...
Loop窗口管理:终极Mac多窗口高效布局指南
Loop窗口管理:终极Mac多窗口高效布局指南 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 你是不是经常在Mac上同时打开十几个窗口,然后迷失在层层叠叠的界面中?写代码…...
避开这3个坑,你的STM32F103+LoRa+阿里云项目才能跑得稳
STM32F103LoRa阿里云物联网项目稳定性优化实战指南 在物联网设备开发中,稳定性往往是区分业余原型与工业级产品的关键分水岭。许多开发者能够快速搭建起STM32F103与LoRa模块的基础通信框架,并实现阿里云物联网平台的数据上传,却在长期运行中频…...
为什么MIT化学系要求博士生必学NotebookLM?——解密其在NMR谱图关联推理与副产物预测中的3个未公开API调用逻辑
更多请点击: https://intelliparadigm.com 第一章:NotebookLM化学研究辅助 NotebookLM 是 Google 推出的基于 AI 的研究协作者,专为深度阅读、知识整合与推理设计。在化学研究场景中,它能高效解析 PDF 格式的文献(如 …...
共享茶室智能系统与运营全解析:从空间设计到自动化管理
1. 项目概述:为什么“共享茶室”正在重塑传统茶饮消费如果你最近留意过城市里的新业态,可能会发现一种名为“共享茶室”的空间正在悄然兴起。它不像传统的茶馆那样需要高昂的消费和复杂的社交礼仪,也不像奶茶店那样主打快节奏的“即买即走”。…...
HoRain云--Skills 工作原理
🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...
Ollama + Open WebUI部署教程:本地运行大语言模型,自建私有 AI 助手
Ollama Open WebUI部署教程:本地运行大语言模型,自建私有 AI 助手 不想把对话内容发给 OpenAI?有私密需求或离线场景?Ollama 让你在自己的服务器上运行 Llama、Qwen、DeepSeek 等开源大语言模型,Open WebUI 提供和 Ch…...
RakkasJS深度解析:基于Bun的全栈React框架性能与迁移实践
1. 项目概述:下一代全栈React框架的探索如果你和我一样,在过去几年里深度使用过Next.js、Remix或者SvelteKit这类全栈框架,那你肯定对它们带来的开发体验又爱又恨。爱的是它们统一了前后端,让全栈开发变得前所未有的顺畅ÿ…...
