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实现自动更换ip的方法
May 05 Python
Python实现快速多线程ping的方法
Jul 15 Python
Python遍历目录中的所有文件的方法
Jul 08 Python
Python线程指南详细介绍
Jan 05 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
python发送告警邮件脚本
Sep 17 Python
将python运行结果保存至本地文件中的示例讲解
Jul 11 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
python中%格式表达式实例用法
Jun 18 Python
Python测试框架pytest高阶用法全面详解
Jun 01 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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 intval的测试代码发现问题
2008/07/27 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
bootstrap响应式表格实例详解
2017/05/15 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
微信小程序自定义轮播图
2018/11/04 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
[01:01]2020完美高校联赛(秋)西安落幕
2021/03/11 DOTA
python简单获取数组元素个数的方法
2015/07/13 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
python装饰器原理与用法深入详解
2019/12/19 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
python re模块和正则表达式
2021/03/24 Python
工程专业求职自荐书范文
2014/02/18 职场文书
少年闰土教学反思
2014/02/22 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
禁毒宣传标语
2014/06/19 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python