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 相关文章推荐
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
Python Pillow Image Invert
Jan 22 Python
Python匿名函数及应用示例
Apr 09 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
keras中的backend.clip用法
May 22 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
Python如何执行系统命令
Sep 23 Python
Python类的继承super相关原理解析
Oct 22 Python
Pycharm常用快捷键总结及配置方法
Nov 14 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 CURL模拟GET及POST函数代码
2010/04/25 PHP
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
PDO::prepare讲解
2019/01/29 PHP
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
微信小程序 标签传入数据
2017/05/08 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
简单谈谈python的反射机制
2016/06/28 Python
python梯度下降法的简单示例
2018/08/31 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
Python中请不要再用re.compile了
2019/06/30 Python
tensorflow保持每次训练结果一致的简单实现
2020/02/17 Python
Python unittest工作原理和使用过程解析
2020/02/24 Python
django项目中新增app的2种实现方法
2020/04/01 Python
python实现IOU计算案例
2020/04/12 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
init进程的作用
2015/08/20 面试题
幼儿园新学期寄语
2014/01/18 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
社区志愿者活动方案
2014/08/18 职场文书
2014年学习部工作总结
2014/11/12 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
教育读书笔记
2015/07/02 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
vue修饰符.capture和.self的区别
2022/04/22 Vue.js