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 二维数组及画图的实例详解
Apr 03 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python对切片命名的实现方法
Oct 16 Python
pandas去除重复列的实现方法
Jan 29 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
Python 类的魔法属性用法实例分析
Nov 21 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
Jun 30 Python
Python3基于plotly模块保存图片表格
Aug 03 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
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
js 省地市级联选择
2010/02/07 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
Javascript非构造函数的继承
2015/04/27 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
React 子组件向父组件传值的方法
2017/07/24 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
Python使用Numpy模块读取文件并绘制图片
2020/05/13 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
2021/01/28 Python
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
感恩老师演讲稿400字
2014/08/28 职场文书
社区好人好事材料
2014/12/26 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
2015年安全月活动总结
2015/03/26 职场文书
2015年教研工作总结
2015/05/23 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
党员读书活动心得体会
2016/01/14 职场文书
2019教师的学习计划
2019/06/25 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
Python 如何实现文件自动去重
2021/06/02 Python
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python