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调用C语言开发的共享库方法实例
Mar 18 Python
python获取当前日期和时间的方法
Apr 30 Python
Python编写生成验证码的脚本的教程
May 04 Python
使用python调用zxing库生成二维码图片详解
Jan 10 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
Python3之读取连接过的网络并定位的方法
Apr 22 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
Python之列表实现栈的工作功能
Jan 28 Python
浅谈Python type的使用
Nov 19 Python
TensorFlow tensor的拼接实例
Jan 19 Python
python异常处理之try finally不报错的原因
May 18 Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 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实现ping
2006/10/09 PHP
php基础教程 php内置函数实例教程
2012/08/21 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
php实现字符串首字母转换成大写的方法
2015/03/17 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
JS截取字符串常用方法详细整理
2013/10/28 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python代码制作configure文件示例
2014/07/28 Python
解决Mac安装scrapy失败的问题
2018/06/13 Python
Django中间件基础用法详解
2019/07/18 Python
css sprite简单实例
2016/05/23 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
三个儿子教学反思
2014/02/03 职场文书
会务接待方案
2014/02/27 职场文书
应聘会计求职信
2014/06/11 职场文书
技术经济专业求职信
2014/09/03 职场文书
男方婚礼答谢词
2015/01/20 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
病假证明模板
2015/06/19 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
PostgreSQL将数据加载到buffer cache中操作方法
2021/04/16 PostgreSQL