解决 Django 多进程下,logging 记录日志错乱问题

  1. 由于 2 号进程将 error.log 重命名为 error.log-2020-05-15,也会导致 1 号进程继续向 error.log-2020-05-15 写入,这样就造成了写入错乱。

原因清楚了,那么,有什么解决办法呢?两个方案:

使用 concurrent-log-handler 包

这个包通过加锁的方式实现了多进程安全,并且可以在日志文件达到特定大小时,分割文件,但是不支持按时间分割。

包的源码我并没有仔细研究,也就没办法再细说了,大家如果感兴趣的话可以自己找来看。

由于我的需求是按时间进行分割,显然就不能用了,自己写吧。

重写 TimedRotatingFileHandler

通过上面的分析可以知道,出问题的点就是发生在日志分割时,一是删文件,二是没有及时更新写入句柄。

所以针对这两点,我的对策就是:一是去掉删文件的逻辑,二是在切割文件时,及时将写入句柄更新到最新。

代码如下:

解决多进程日志写入混乱问题

import os

import time

from logging.handlers import TimedRotatingFileHandler

class CommonTimedRotatingFileHandler(TimedRota

  • 26
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django中,可以使用多线程或多进程来读取MySQL数据库。具体实现可以通过以下几种方式: 1. 使用Django ORM的数据库连接池:Django ORM已经实现了连接池,可以通过以下方式来配置: ``` DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', 'HOST': '127.0.0.1', 'PORT': '3306', 'CONN_MAX_AGE': 60 * 60 * 2, # 设置连接池中连接的最大寿命 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", 'charset': 'utf8mb4', 'autocommit': True, 'max_connections': 20, # 设置连接池中最大连接数 }, }, } ``` 在上述配置中,我们设置了连接池中最大连接数为20,连接的最大寿命为2小时。这样,在多个线程或进程中对数据库的访问都会被连接池处理,从而避免了连接过多的问题。 2. 使用第三方连接池:除了Django ORM自带的连接池,还可以使用第三方的连接池,比如`DBUtils`、`SQLAlchemy`等。这些连接池都提供了更加灵活的配置选项和更多的功能,可以根据实际情况选择使用。 3. 使用多进程或多线程:除了使用连接池外,还可以使用多进程或多线程来读取MySQL数据库。在多进程或多线程中,可以使用`multiprocessing`或`threading`模块来创建进程或线程,然后在每个进程或线程中创建MySQL连接,并进行对应的操作。需要注意的是,在使用多进程或多线程时,需要考虑到线程或进程之间的数据共享和同步问题,避免出现数据竞争等问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值