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使用time模块实现指定时间触发器示例
May 18 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
Jan 14 Python
python dataframe NaN处理方式
Dec 26 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
Python 解决相对路径问题:"No such file or directory"
Jun 05 Python
python爬虫之利用selenium模块自动登录CSDN
Apr 22 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后门代码解析
2014/07/05 PHP
关于php中一些字符串总结
2016/05/05 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP多进程简单实例小结
2019/11/09 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
js前端日历控件(悬浮、拖拽、自由变形)
2017/03/02 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
python递归实现快速排序
2018/08/18 Python
python画双y轴图像的示例代码
2019/07/07 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
Python安装及Pycharm安装使用教程图解
2019/09/20 Python
Python表达式的优先级详解
2020/02/18 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
挪威户外活动服装和装备购物网站:Bergfreunde挪威
2016/10/20 全球购物
《大海那边》教学反思
2014/04/09 职场文书
工厂见习报告范文
2014/10/31 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript