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优化技巧之利用ctypes提高执行速度
Sep 11 Python
python+opencv实现动态物体追踪
Jan 09 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python Django 创建应用过程图示详解
Jul 29 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
python中判断文件结束符的具体方法
Aug 04 Python
用python基于appium模块开发一个自动收取能量的小助手
Sep 25 Python
Python实现对齐打印 format函数的用法
Apr 28 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中解析带中文字符的url函数分享
2015/01/20 PHP
php适配器模式简单应用示例
2019/10/23 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
使用js修改客户端注册表的方法
2013/08/09 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
土木工程专业自荐信
2013/10/04 职场文书
人事档案接收函
2014/01/12 职场文书
文秘求职信范文
2014/04/10 职场文书
《长征》教学反思
2014/04/27 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书