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中的sort方法使用详解
Jul 25 Python
利用Python学习RabbitMQ消息队列
Nov 30 Python
windows下添加Python环境变量的方法汇总
May 14 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
对python 中class与变量的使用方法详解
Jun 26 Python
python中对数据进行各种排序的方法
Jul 02 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
Python实现串口通信(pyserial)过程解析
Sep 25 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
python编写实现抽奖器
Sep 10 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中使用excel的简单介绍
2013/08/02 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
js获取图片大小的函数代码
2011/09/20 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
3分钟快速搭建nodejs本地服务器方法运行测试html/js
2017/04/01 NodeJs
微信小程序 图片上传实例详解
2017/05/05 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python脚本实现下载合并SAE日志
2015/02/10 Python
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
Python 多维List创建的问题小结
2019/01/18 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
使用python绘制温度变化雷达图
2019/10/18 Python
详解Python中的Lock和Rlock
2021/01/26 Python
找工作最新求职信
2013/12/22 职场文书
2014普法依法治理工作总结
2014/12/18 职场文书
工程资料员岗位职责
2015/04/13 职场文书
2015年营业员工作总结
2015/04/23 职场文书
安全教育日主题班会
2015/08/13 职场文书
团委副书记工作总结
2015/08/14 职场文书
创业计划书之网吧
2019/10/10 职场文书