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

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.mfbz.cn/a/345847.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jQuery语法知识(表单)

表单 1、:button Selector 描述:选择所有按钮元素和类型为按钮的元素 语法 :jQuery(":button") <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

C++:C/C++内存管理

C&#xff1a;C/C内存管理 C语言C语言内存分配回顾malloc & calloc & realloc & free Cnew & deletenew[ ] & delete[ ]定位newnew & delete原理 malloc / free 与 new / delete对比 C语言 C语言内存分配回顾 我们先回顾一下C语言的内存分配&#xf…

分享一个剧本(改编自我)

不知道是不是错过了一个喜欢我的女孩&#xff0c;一个很不错的女孩&#xff0c;当初没勇气表白。去年表白过但女孩表示仅想是永远的朋友&#xff0c;今天翻他的朋友圈发现2021年我生日时&#xff0c;她分享了这首歌曲&#xff0c;还评论Best wishes!!!&#xff0c;高中有一次我…

抖音怎么引导到公众号丨数灵通

抖音是一款非常流行的社交媒体应用程序&#xff0c;用户可以在其中分享短视频和互动内容。许多用户希望通过抖音来引流到他们的微信公众号&#xff0c;以扩大影响力并吸引更多粉丝。以下是一些关于如何在抖音上跳转到微信公众号的科普信息&#xff1a; 1.信息流广告&#xff1a…

PPP协议原理介绍+报文分析+配置指导-RFC1661

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在PPP协议报文的基础上进行介绍。 关于PPP协议基本原理&#xff0c;可参考RFC1661-The Point-to-Point Protocol (PPP)。 关于P…

Linux的奇妙冒险———vim的用法和本地配置

vim的用法和本地配置 一.vim的组成和功能。1.什么是vim2.vim的多种模式 二.文本编辑&#xff08;普通模式&#xff09;的快捷使用1.快速复制&#xff0c;粘贴&#xff0c;剪切。2.撤销&#xff0c;返回上一步操作3.光标的控制4.文本快捷变换5.批量化操作和注释 三.底行模式四.v…

响应拦截器的 return Promise.reject(res.data.message)

今天在看老师讲解代码的时候,解决了我心中的一些疑惑。 在做excel文件导出的时候,没有告诉浏览器文件的格式是Blod产生了报错。 看下图: 可以看到下面的内容:如果业务成功 返回 res.data 如果业务失败,给出错误信息的提示&#xff0c;将这个错误抛出去。 因此我们在发送一个…

2023春秋杯冬季赛 --- Crypto wp

文章目录 前言Cryptonot_wiener 前言 比赛没打&#xff0c;赛后随便做一下题目 Crypto not_wiener task.py: from Crypto.Util.number import * from gmpy2 import * import random, os from hashlib import sha1 from random import randrange flagb x bytes_to_long(f…

面试题合集

目录 二叉树和动态规划的框架图内容补充数组为什么下标从0开始&#xff1f;windows内存上存储数据采用是什么模式&#xff1f;atoi 和itoa函数的实现字节对齐方式&#xff0c;为什么进行内存对齐&#xff1f;结构体的大小二分查找有重复数字中最左边的数 最右边的数工厂模式 单…

幻兽帕鲁PalWorld服务器搭建详细教程

幻兽帕鲁PalWorld是一款由Pocketpair开发的游戏&#xff0c;融合了多种玩法&#xff0c;其独特的题材和画风吸引了很多玩家。为了更好地进行游戏体验&#xff0c;很多玩家选择自行搭建服务器。本文将详细介绍如何搭建幻兽帕鲁PalWorld服务器。 第一步&#xff1a;购买服务器 根…

面试官灵魂一问,曾写过什么剧本?我:“简单的有,使用Ansible对lnmp架构部署!”

引言&#xff1a;今天带大家使用ansible进行对lnmp的架构部署&#xff0c;并做wordpress网站项目 准备ansible端 db1(安装nginx与php和项目) db2(安装数据库) 并做好管理关联配置 一、创建角色 路径可以自定义&#xff0c;例/root/juben.dir #ansible-galaxy init nginx#an…

.NET 跨平台图形库 SkiaSharp 基础应用

写在前面 SkiaSharp 是适用于 .NET 和 C# 的 2D 图形系统&#xff0c;由开源 Skia 图形引擎提供支持&#xff0c;在 Google 产品中广泛使用。 可以在应用程序中使用 SkiaSharp Xamarin.Forms 绘制 2D 矢量图形、位图和文本。支持跨平台&#xff0c;Windows、Linux、Anroid、IO…

docker-compose搭建redis哨兵模式

文件存放如下图&#xff1a; docker-compose.yml文件内容如下&#xff1a; version: 3.3 services:master:image: redis:3.2.12restart: alwayscontainer_name: redis-mastercommand: redis-server /usr/local/redis/conf/redis.confports:- 6380:6380volumes:- /root/redis/…

java开发——《并发编程》

目录 一.jmm 二.并发了什么 1.只有一个核&#xff08;单核&#xff09;并发还有没有意义 2.单核&#xff0c;还有什么可见性问题 3.并发和并行 三.volitaile 1.变量的可见性问题 2.原因是什么 3.本次修改的变量直接刷到主内存 4.声明其他内存对于这个地址的缓存无效 …

Java Web(三)--CSS

介绍 为什么需要&#xff1a; 在没有 CSS 之前&#xff0c;想要修改 HTML 元素的样式需要为每个 HTML 元素单独定义样式属性&#xff0c;费心费力&#xff1b;CSS 可以让 html 元素(内容) 样式(CSS)分离&#xff0c;提高web 开发的工作效率(针对前端开发)&#xff0c;从而…

3.chrony服务器

目录 1. 简介 1.1. 重要性 1.2. Linux的两个时钟 1.3. 设置日期时间 1.3.1. timedatectl命令设置 1.3.2. date命令设置 1.4. NTP 1.5. Chrony介绍 2. 安装与配置 2.1. 安装&#xff1a; 2.2. Chrony配置文件分析 2.3. 同步时间服务器 2.3.1. 授时中心 2.3.2. 实验…

ssh登录失败:connection closed by foreign host

问题1&#xff1a; ssh登录不上&#xff0c;连接上就断掉 inetd.conf显示2277已打开&#xff0c;ip也没有冲突。 但是这两个文件是空的(size 0k)&#xff1a; dropbear_dss_host_key dropbear_rsa_host_key 把/etc/dropbear里面的东西删掉,重新生成秘钥文件&#xff1a; …

Java强训day1(选择题编程题)

选择题 class Person{//堆public String name;public int age;public double weight;//方法区public void eat(){System.out.println(name"eat()");} }public class TestDemo2 {public static void main(String[] args) {//栈Person p1new Person();Person p2new Per…

基于python豆瓣电影评论的情感分析和聚类分析,聚类分析有手肘法进行检验,情感分析用snownlp

基于Python的豆瓣电影评论的情感分析和聚类分析是一种用于探索电影评论数据的方法。 情感分析 情感分析旨在从文本中提取情感信息&#xff0c;并对其进行分类&#xff0c;如正面、负面或中性。在这里&#xff0c;我们使用了一个名为snownlp的Python库来进行情感分析。Snownlp是…

深入了解达梦数据库的增删查改操作:从入门到精通

目录 前言&#xff1a; 一.达梦数据库的增删改查 1.创建数据库 2.插入数据 3.查看数据 4.删除数据 5.数据 前言&#xff1a; 在当今数字化的时代&#xff0c;数据库已经成为企业和组织的核心资产&#xff0c;是实现高效数据处理、存储和管理的重要工具。达梦数据库&…
最新文章