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的几条建议分享
Feb 10 Python
Python抓取Discuz!用户名脚本代码
Dec 30 Python
python并发编程之线程实例解析
Dec 27 Python
python2 与python3的print区别小结
Jan 16 Python
python 删除列表里所有空格项的方法总结
Apr 18 Python
matplotlib savefig 保存图片大小的实例
May 24 Python
windows下python安装pip图文教程
May 25 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
python实现飞机大战游戏(pygame版)
Oct 26 Python
浅谈Python数学建模之数据导入
Jun 23 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网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP分页类集锦
2014/11/18 PHP
php+mysql实现无限级分类
2015/11/11 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
js对象的比较
2011/02/26 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
从0搭建vue-cli4脚手架
2020/06/17 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python聚类算法之DBSACN实例分析
2015/11/20 Python
pycharm远程调试openstack代码
2017/11/21 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
用python写PDF转换器的实现
2020/10/29 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
网吧收银员岗位职责
2013/12/14 职场文书
最新创业融资计划书
2014/01/19 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
三潭印月的导游词
2015/02/12 职场文书
病房管理制度范本
2015/08/06 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
MySQL基础(二)
2021/04/05 MySQL
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
SQL Server实现分页方法介绍
2022/03/16 SQL Server
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android