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笔记(1) 关于我们应不应该继续学习python
Oct 24 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
简述Python2与Python3的不同点
Jan 21 Python
python3写的简单本地文件上传服务器实例
Jun 04 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
Mar 27 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 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版(2)
2006/10/09 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
php中stdClass的用法分析
2015/02/27 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
python的else子句使用指南
2016/02/27 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
财务人员求职自荐书范文
2014/02/10 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
大班亲子运动会方案
2014/06/10 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
毕业设计致谢语
2015/05/14 职场文书
工作简报格式范文
2015/07/21 职场文书
python如何查找列表中元素的位置
2022/05/30 Python
mysql实现将字符串字段转为数字排序或比大小
2022/06/14 MySQL
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android