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的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
python 写入csv乱码问题解决方法
Oct 23 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
学生信息管理系统python版
Oct 17 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
Oct 21 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
Django框架首页和登录页分离操作示例
May 28 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
python 实现分组求和与分组累加求和代码
May 18 Python
解决keras使用cov1D函数的输入问题
Jun 29 Python
我对PyTorch dataloader里的shuffle=True的理解
May 20 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
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
jQuery使用手册之一
2007/03/24 Javascript
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
vue2和vue3的v-if与v-for优先级对比学习
2020/10/10 Javascript
Python变量和字符串详解
2017/04/29 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
python使用Tesseract库识别验证
2018/03/21 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
自我鉴定范文300字
2013/10/01 职场文书
法学专业本科生自荐信范文
2013/12/17 职场文书
自荐信格式简述
2014/01/25 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
会计系毕业生求职信
2014/05/28 职场文书
森林防火标语
2014/06/23 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
导游词之长城八达岭
2019/09/24 职场文书