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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
在Python的Tornado框架中实现简单的在线代理的教程
May 02 Python
Python中函数参数调用方式分析
Aug 09 Python
python求质数的3种方法
Sep 28 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
Mar 09 Python
Python telnet登陆功能实现代码
Apr 16 Python
keras自定义回调函数查看训练的loss和accuracy方式
May 23 Python
python和php哪个容易学
Jun 19 Python
详解Python遍历列表时删除元素的正确做法
Jan 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
使用eAccelerator加密PHP程序
2008/10/03 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
php中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
PHP程序员的技术成长规划
2016/03/25 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
jQuery中.attr()和.data()的区别分析
2017/09/03 jQuery
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
jquery ajaxfileuplod 上传文件 essyui laoding 效果【防止重复上传文件】
2018/05/26 jQuery
浅谈vue在html中出现{{}}的原因及解决方式
2020/11/16 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
Python的迭代器和生成器
2015/07/29 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
浅谈python写入大量文件的问题
2018/11/09 Python
python文件和文件夹复制函数
2020/02/07 Python
python中selenium库的基本使用详解
2020/07/31 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
培训讲师邀请函
2014/01/10 职场文书
称象教学反思
2014/02/03 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
世界文化遗产导游词
2019/08/07 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python
你真的会用Mysql的explain吗
2022/03/31 MySQL