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实现定时播放mp3
Mar 29 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
python开发游戏的前期准备
May 05 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
python如何实现视频转代码视频
Jun 17 Python
python基于paramiko将文件上传到服务器代码实现
Jul 08 Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 Python
Python进行特征提取的示例代码
Oct 15 Python
python3排序的实例方法
Oct 20 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
Python实现天气查询软件
Jun 07 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文件 php excelreader读取excel文件
2012/12/06 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
推荐dojo学习笔记
2007/03/24 Javascript
jquery 插件开发方法小结
2009/10/23 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
2020/08/27 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
Python面向对象编程基础解析(二)
2017/10/26 Python
使用python Fabric动态修改远程机器hosts的方法
2018/10/26 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
python实现电子产品商店
2019/02/26 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
高级Java程序员面试要点
2013/08/02 面试题
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
工商管理专业实习生自我鉴定
2013/09/29 职场文书
应届生学校辅导员求职信
2013/11/07 职场文书
社区党员公开承诺书
2014/08/30 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
一篇文章弄懂Python中的内建函数
2021/08/07 Python
如何使用SQL Server语句创建表
2022/04/12 SQL Server