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中return和print的一些理解
Aug 18 Python
django中的setting最佳配置小结
Nov 21 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
python 把列表转化为字符串的方法
Oct 23 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
python入门之井字棋小游戏
Mar 05 Python
python中常见错误及解决方法
Jun 21 Python
Python3压缩和解压缩实现代码
Mar 01 Python
python 对图片进行简单的处理
Jun 23 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
php递归函数怎么用才有效
2018/02/24 PHP
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
前端深入理解Typescript泛型概念
2020/03/09 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
Python之父谈Python的未来形式
2016/07/01 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
使用Python 正则匹配两个特定字符之间的字符方法
2018/12/24 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
小学生自我鉴定
2013/10/12 职场文书
消防战士优秀事迹材料
2014/02/13 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
小组口号大全
2014/06/09 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
蓬莱阁导游词
2015/02/04 职场文书
高中家长意见怎么写
2015/06/03 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书