Django多进程滚动日志问题解决方案


Posted in Python onDecember 17, 2019

这篇文章主要介绍了Django多进程滚动日志问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

使用RotatingFileHandler控制日志文件的大小

# settings.py
LOGGING = {
  ...
  'handlers': {
    ...
    'file': {
      'level': 'INFO',
      'class': 'logging.RotatingFileHandler',
      'filename': os.path.join(LOGS_DIR, 'app.log'),
      'formatter': 'verbose',
      'maxBytes': 1024,
      'backupCount': 5
    },
    ...
  }
  ...
}

设置RotatingFileHandler的maxBytes与backupCount,这两个参数默认是0。

当两个参数都不为0时,会执行rallover过程:log文件大小接近maxBytes时,新建一个文件作为log的输出,旧的文件会被加上类似'.1'、'.2'的后缀。

举个例子,如果backupCount=5,log file定义的名字为app.log,你会得到app.log, app.log.1, app.log.2 一直到 app.log.5。

然而被写入日志的永远是app.log,写满了之后重命名为app.log.1,如果app.log.1存在,app.log.1会先被重名名为app.log.2,依此类推。

另外,如果app.log.5存在,它会被删除。

windows环境遇到的问题

PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。

首先,Django默认启用两个进程,一个进程用来检测文件变化,另一个进程是正经的服务器进程。settting.py这个文件被加载了两次,也就是日志文件打开了两次,如果是服务器进程先启动,则看不出毛病来;如果是监控进程首先打开了从settings.py加载了日志,那么正经服务器进程就无法再次加载日志了。

如果你的Django项目是单进程的,那么在启动Django项目的时候使用--noreload就可以解决

python manage.py runserver 0.0.0.0:80 --noreload

noreload表示不启动Django的监控进程,也就是说项目代码的改变不再会影响已经载入内存中的代码,这样,Django就只会起一个进程。

但是,如果你的项目是多进程的,或者在某些单独的模块,比如celery中为了使用Django的ORM而使用了django.setup()

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
import django
django.setup()

那么就需要用另一个日志模块解决

pip install concurrent-log-handler

在LOGGING中,用concurrent_log_handler.ConcurrentRotatingFileHandler代替logging.RotatingFileHandler

# settings.py
LOGGING = {
  ...
  'handlers': {
    ...
    'file': {
      'level': 'INFO',
      'class': 'concurrent_log_handler.ConcurrentRotatingFileHandler',
      'filename': os.path.join(LOGS_DIR, 'app.log'),
      'formatter': 'verbose',
      'maxBytes': 1024,
      'backupCount': 5
    },
    ...
  }
  ...
}

测试一下,问题解决

另外,如果是linux系统下的多进程Django,可以用ConcurrentLogHandler模块

pip install ConcurrentLogHandler
# settings.py
LOGGING = {
  ...
  'handlers': {
    ...
    'file': {
      'level': 'INFO',
      'class': 'cloghandler.ConcurrentRotatingFileHandler',
      'filename': os.path.join(LOGS_DIR, 'app.log'),
      'formatter': 'verbose',
      'maxBytes': 1024,
      'backupCount': 5
    },
    ...
  }
  ...
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python中的四种队列
May 21 Python
python 剪切移动文件的实现代码
Aug 02 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
python语言基本语句用法总结
Jun 11 Python
python实现计算器功能
Oct 31 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
通过实例解析python描述符原理作用
Jan 22 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
Python 如何展开嵌套的序列
Aug 01 Python
python django中8000端口被占用的解决
Dec 17 #Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 #Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 #Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 #Python
selenium+Chrome滑动验证码破解二(某某网站)
Dec 17 #Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 #Python
Django app配置多个数据库代码实例
Dec 17 #Python
You might like
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
javascript实现的猜数小游戏完整实例代码
2016/05/10 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
简单解决Python文件中文编码问题
2015/11/22 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
Python tkinter label 更新方法
2018/10/11 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
学习Django知识点分享
2019/09/11 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
python实现简易淘宝购物
2019/11/22 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Django 返回json数据的实现示例
2020/03/05 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
计算机专业毕业生求职信分享
2013/12/24 职场文书
总经理助理工作职责
2014/02/06 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
自查自纠工作总结
2014/10/15 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript