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 16 Python
python教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
零基础写python爬虫之urllib2使用指南
Nov 05 Python
视觉直观感受若干常用排序算法
Apr 13 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
Python imutils 填充图片周边为黑色的实现
Jan 19 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 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 session的类
2009/02/01 PHP
php中常用字符串处理代码片段整理
2011/11/07 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
php实现微信支付之企业付款
2018/05/30 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python装饰器基础详解
2016/03/09 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
简单了解python关系(比较)运算符
2019/07/08 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
香港交友网站:be2香港
2018/07/22 全球购物
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
应届生自荐信范文
2014/02/21 职场文书
工程质量保证书
2015/05/09 职场文书
《社戏》教学反思
2016/02/22 职场文书
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL