uvicorn日志清空问题以及uvicorn日志配置

news2024/11/24 23:56:00

uvicorn日志清空问题

1、配置:

uvicorn + starlette

2、现象描述:

当我使用uvicorn + starlette进行Python web开发的时候,本来想把所有的日志都打印到一个文件里面,于是我写了一个启动脚本,所有的日志都输出到log.txt里面:

$ more run_s 
nohup uvicorn server:app --host 0.0.0.0 --port 6786 > log.txt 2>&1 &

运行一段时间后,我发现log.txt里面的日志占了很大的磁盘空间,于是我就准备手动的清空log.txt文件,执行了下面的命令:

$ > log.txt

命令执行之后,输入ll查看一下最终结果,发现log.txt的大小确实变成了0,正准备满心欢喜的收工去喝杯小酒解解乏,基于程序员的敏感度,我进行了二次确认,就发送了一个新请求,待新请求出现后再次输入了ll命令检查日志文件,发现日志文件占用的磁盘大小又变回了为清空之前的模样,好像我们执行的清空命令毫无作用,赶紧查看一下log.txt的内容:

发现日志文件前半部分缺失内容被清空了,文件的尾部出现了我二次确认时发送的请求,神奇。

3、根因分析:

3.1、采用daphne + starlette验证

重复了上面的步骤,发现日志可以正常清空,于是排除starlette的问题,问题出现在uvicorn上

3.2、查看uvicorn的日志配置

默认情况下,uvicorn使用了logging.StreamHandler,流式写入日志,logging.StreamHandler 会记录文件写入位置,在下一次写入日志时会自动seek到上一次的位置再写新日志。由于日志已被清空,所以在上一次写入位置之前的内容全部为NUL,即0。

uvicorn按天输出访问日志配置

其实从一开始我就不应该使用默认的日志输出方式,而应该采用自定义的方式,比如一天生成一个文件,或者一小时生成一个文件,这样过期的文件直接删除,也不需要手动做清空操作。于是开始寻找解决方案。从上面的截图我们可以看到,uvicorn默认有个配置文件,仿照它来写即可。

1、日志配置文件:

uvicorn支持多种格式的配置文件,我们这里采用大家日常比较熟悉的格式:json,新建一个uvicorn_log.json:

{
  "version": 1,
  "disable_existing_loggers": "False",
  "formatters": {
    "default": {
      "()": "uvicorn.logging.DefaultFormatter",
      "fmt": "%(levelprefix)s %(message)s",
      "use_colors": "None"
    },
    "access": {
      "()": "uvicorn.logging.AccessFormatter",
      "fmt": "%(levelprefix)s %(client_addr)s - %(request_line)s %(status_code)s"
    }
  },
  "handlers": {
    "default": {
      "formatter": "default",
      "class": "logging.StreamHandler",
      "stream": "ext://sys.stderr"
    },
    "access": {
      "formatter": "access",
      "class": "logging.handlers.TimedRotatingFileHandler",
      "filename": "./access.log",
      "when": "MIDNIGHT",
      "interval": 1,
      "backupCount": 5,
      "level": "DEBUG"
    }
  },
  "loggers": {
    "uvicorn": {
      "handlers": [
        "default"
      ],
      "level": "INFO",
      "propagate":0
    },
    "uvicorn.error": {
      "handlers": [
        "default"
      ],
      "level": "INFO",
      "propagate":0
    },
    "uvicorn.access": {
      "handlers": [
        "access"
      ],
      "level": "INFO",
      "propagate":0
    }
  }
}

注意事项:

1、"propagate":0 这个地方需要配置为0,而不是False,因为代码里面是利用 if not 判断的

2、"when": "MIDNIGHT"这个地方如果你想每天生成一个文件,需要配置为MIDNIGHT,而不是D,配置为D是每隔24小时生成一个文件

2、日志文件使用

使用--log-config uvicorn_log.json来启动uvicorn即可

$ more run_s 
nohup uvicorn server:app --host 0.0.0.0 --port 6786 --log-config uvicorn_log.json > log.txt 2>&1 &

总结:

1、默认的uvicorn的日志清空存在BUG,建议不要使用

2、采用按一定的间隔来生成文件的策略更简单,让Python自己来维护日志文件的生成与清理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最大流-Dinic算法,原理详解,四大优化,详细代码

文章目录 零、前言一、概念回顾(可略过)1.1流网络1.2流1.3最大流1.4残留网络1.5增广路径1.6流网络的割1.7最大流最小割定理1.7.1证明 1.8Ford-Fulkerson方法 二、Dinic算法2.1EK算法的可优化之处2.2Dinic算法的优化策略2.3Dinic算法原理2.3.1找增广路2.3.2更新剩余容量 2.4算法…

浏览器无网

目录 1.运行网络诊断,确认原因 原因A.远程计算机或设备将不接受连接(该设备或资源(Web 代理)未设置为接受端口“7890”上的连接 原因B.DNS服务器未响应 场景A.其他的浏览器可以打开网页,自带的Edge却不行 方法A:关闭代理 Google自带翻译…

<C++>STL->vector

vector的介绍 vector的使用文档 vector是一个可改变数组大小的序列容器vector和数组一样采取连续的空间存放数据,可以使用方括号访问vector的元素,和数组一样高效。但是vector的大小可以动态增长,而数组不行实际上vector内部使用一个动态分…

MySQL-SQL-DQL

DQL-介绍 DQL-语法 基本查询 1、查询多个字段 2、设置别名 3、去除重复记录 条件查询 1、语法 2、条件 聚合函数 1、介绍 2、常见的聚合函数 3、语法 分组查询 1、语法 2、where与having区别 排序查询 1、语法 2、排序方式 分页查询 1、语法 DQL-执行顺序

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

C++大学教程(第九版)6.29素数

题目 (素数)素数是只能被1和自已整除的整数。例如,235和7是素数而468和9不是素数 a)编写一个函数,确定一个数是否是素数。 b)在程序中使用这个函数,该程序确定和打印2 ~10000之间的所有素数。在确信已找到所有的素数之前,实际需测试这些数中…

五邑大学餐厅网络点餐系统设计与实现(包含完整源码详细开发过程)

博主介绍:✌专研于前后端领域优质创作者、本质互联网精神开源贡献答疑解惑、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦! 🍅文末获…

你不知道的git如何撤销回退版本

简言之:从1 回退到 3,在3版本通过回退记录(git reflog)找到它的上一条回退记录的hash值,复制1的hash值进行回退,执行git reset --hard 粘贴1的hash值进来,此时就回到1的版本了,执行git log即可看到1、2、3、…

安装pytorch GPU的方法,一次安装成功!!win10、win11皆可用!!

前提—查看是否有NVIDIV英伟达显卡!! 在控制面板打开设备管理器 一、查看电脑的显卡驱动版本 方法一:在cmd命令窗口中输入nvidia-smi,可以发现版本为12.2 方法2:点击NVIDIA控制面板→系统信息 二、安装CUDA 方法1…

算法(4)——前缀和

目录 一、前缀和的定义 二、一维前缀和 三、一维前缀和OJ题 3.1、前缀和 3.2、寻找数组中心下标 3.3、除自身以外数组的乘积 3.4、和为K的数组 3.5、和可被K整除的子数组 3.6、连续数组 四、二位前缀和 4.1、二维前缀和 4.2、矩阵区域和 一、前缀和的定义 对于一个…

探索全球DNS体系 | 从根服务器到本地解析

DNS 发展 DNS(Domain Name System)的起源可以追溯到互联网早期。 早期的挑战: 早期互联网主要通过IP地址进行通信,用户需要记住复杂的数字串来访问网站。 需求的催生: 随着互联网的扩大,更简单、易记的…

pytest+allure 生成中文报告

背景 已安装pytestallure,生成的报告是英文 allure生成中文报告 参考:allure report 报告中文化及其它优化 方法1:直接在报告中切换中文 方法2:依赖系统中文语言 创建一个setting.js 文件在index.html 同级目录 // 尝试从 l…

java基于安卓开发的流浪动物救助移动应用的设计与实现-计算机毕业设计源码12783

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,流浪动物救助系统被用户普遍使用,为方便用户能…

前端面试题-(BFC,前端尺寸单位,网站页面常见的优化手段)

前端面试题-BFC,前端尺寸单位,网站页面常见的优化手段 BFC前端尺寸单位网站页面常见的优化手段 BFC BFC(block formartting context)块格式化上下文。是通过独立渲染的区域,它拥有自己的渲染规则,可以决定…

51单片机LCD1602调试工具

参考视频:江协科技51单片机 LCD1602头文件代码 #ifndef __LCD1602_H__ #define __LCD1602_H__//用户调用函数: void LCD_Init(); void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char); void LCD_ShowString(unsigned char Line,un…

纷享销客盛邀渠道生态伙伴共赴杭州,凝心聚力共谋未来

2024年1月19日,“凝心聚力 勇立潮头——2024纷享销客首场生态伙伴发展共建会”在杭州绿谷举办。此次会议汇聚了各方60余位伙伴到场,共同探讨行业的未来发展趋势,激发创新力和合作潜力。 会上,纷享销客创始人兼CEO罗旭详尽地介绍了…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views(Model-Based) 项目视图(基于模型)4.1、 B…

鸿蒙 HarmonyOS ArkTS 弹窗、带点击回调

// xxx.ets@Entry@Componentstruct Page {@State color: Color = Color.Blue;build() {Column({ space: 20 }) {Button(弹窗).width(180).height(80).backgroundColor(this.color).onClick(()=>{AlertDialog.show({title: 弹窗标题,message: 弹窗内容,autoCancel: true,alig…

状态空间模型(SSM)是近来一种备受关注的 Transformer 替代技术

状态空间模型(SSM)是近来一种备受关注的 Transformer 替代技术,其优势是能在长上下文任务上实现线性时间的推理、并行化训练和强大的性能。而基于选择性 SSM 和硬件感知型设计的 Mamba 更是表现出色,成为了基于注意力的 Transform…

ElasticSearch的集群管理命令

ElasticSearch版本 {"name" : "data-slave1","cluster_name" : "data-es","cluster_uuid" : "xxxxxxxxxx-eMwxw","version" : {"number" : "7.2.1","build_flavor" : &…