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中使用select模块实现非阻塞的IO
Feb 03 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
python生成式的send()方法(详解)
May 08 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
python列表,字典,元组简单用法示例
Jul 11 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
Aug 10 Python
使用Python的Turtle库绘制森林的实例
Dec 18 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
Apr 07 Python
python实现人像动漫化的示例代码
May 17 Python
python学习笔记之多进程
Aug 06 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写的serv-u的web申请账号的程序
2006/10/09 PHP
php中json_encode中文编码问题分析
2011/09/13 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
js jquery做的图片连续滚动代码
2008/01/06 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
JavaScript分页功能的实现方法
2015/04/25 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
JavaScript实现留言板案例
2020/03/17 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
python检测服务器是否正常
2014/02/16 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
Python MySQL数据库连接池组件pymysqlpool详解
2017/07/07 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
python代码能做成软件吗
2020/07/24 Python
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
广告语设计及教案
2014/03/21 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers