Django - 当文件等于maxBytes时,旋转文件处理程序被卡住

时间:2014-10-31 19:51:38

标签: python django

我对使用Django的RotatingFileHander有问题。

问题是,当文件达到maxBytes大小时,它不会创建新文件,并在您尝试执行logger.info时提供错误消息("任何消息") :

奇怪的是:

  1. 没有人在共享记录器,视图会有自己的记录器,芹菜的任务都有自己的记录器。
  2. 记录器仅在文件顶部启动一次(chartLogger = getLogger ...)同一文件中的不同功能将使用相同的名称

    Logged from file views.py, line 1561
    Traceback (most recent call last):
      File "C:\Python27\lib\logging\handlers.py", line 77, in emit
        self.doRollover()
      File "C:\Python27\lib\logging\handlers.py", line 142, in doRollover
        os.rename(self.baseFilename, dfn)
    WindowsError: [Error 32] The process cannot access the file because it is being used by another process
    
  3. 在我的settings.py中,我有:

        LOGGING = {
                'version': 1,
                'disable_existing_loggers': True,
                'formatters' : {
                    'standard' : {
                        'format' : '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
                    },
                },
                'handlers': {
                    'celery.webapp' : {
                        'level' : 'ERROR',
                        'class' : 'django.utils.log.AdminEmailHandler',
                    },
                    'celery' : {
                        'level' : 'INFO',
                        'class' : 'logging.handlers.RotatingFileHandler',
                        'filename' : 'logs/celery.log',
                        'maxBytes' : 1024*1024*10, # 10MB
                        'backupCount' : 10,
                        'formatter' : 'standard',
                    },
                    'views.error' : {
                        'level' : 'ERROR',
                        'class' : 'django.utils.log.AdminEmailHandler',
                    },
                    'views' : {
                        'level' : 'INFO',
                        'class' : 'logging.handlers.RotatingFileHandler',
                        'filename' : 'logs/views.log',
                        'maxBytes' : 1024*1024*10, # 10MB
                        'backupCount' : 10,
                        'formatter' : 'standard',
                    },
                },
    
                'loggers': {
                    'celery.webapp' : {
                        'level' : 'ERROR',
                        'handlers' : ['celery.webapp'],
                        'propogate' : True,
                    },
                    'celery.webapp.task' : {
                        'level' : 'INFO',
                        'handlers' : ['celery'],
                        'propogate' : True,
                    },
                    'views.logger' : {
                        'level' : 'ERROR',
                        'handlers' : ['views.error'],
                        'propogate' : True,
                    },
                    'views.logger.login' : {
                        'level' : 'INFO',
                        'handlers' : ['views'],
                        'propogate' : True,
                    },
                    'views.logger.register' : {
                        'level' : 'INFO',
                        'handlers' : ['views'],
                        'propogate' : True,
                    },
                    'views.logger.chartConfigure' : {
                        'level' : 'INFO',
                        'handlers' : ['views'],
                        'propogate' : True,
                    },
                    'views.logger.sendEmail' : {
                        'level' : 'INFO',
                        'handlers' : ['views'],
                        'propogate' : True,
                    },
                },
        }
    

    我试图更改不同的文件大小,但它会卡在maxBytes。

    虽然它说该进程无法访问该文件,因为它正被其他一些进程使用。在达到maxBytes之前,所有日志记录都没有问题。

    编辑:

    我已经分割了芹菜和django之间的日志记录。

    LOGGING = {
            'version': 1,
            'disable_existing_loggers': True,
            'formatters' : {
                'standard' : {
                    'format' : '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
                },
            },
            'handlers': {
                'celery.webapp' : {
                    'level' : 'ERROR',
                    'class' : 'django.utils.log.AdminEmailHandler',
                },
                'celery' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/celery.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'celery_chartConfigure' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/celery_chartConfigure.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'celery_register' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/celery_register.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'views.error' : {
                    'level' : 'ERROR',
                    'class' : 'django.utils.log.AdminEmailHandler',
                },
                'views' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/views.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'views_login' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/views_login.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'views_sendEmail' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/views_sendEmail.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'views_register' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/views_register.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
                'views_chartConfigure' : {
                    'level' : 'INFO',
                    'class' : 'logging.handlers.RotatingFileHandler',
                    'filename' : 'logs/views_chartConfigure.log',
                    'maxBytes' : 1024*1024*10, # 10MB
                    'backupCount' : 10,
                    'formatter' : 'standard',
                },
            },
    
            'loggers': {
                'celery.webapp' : {
                    'level' : 'ERROR',
                    'handlers' : ['celery.webapp'],
                    'propogate' : True,
                },
                'celery.webapp.task' : {
                    'level' : 'INFO',
                    'handlers' : ['celery'],
                    'propogate' : True,
                },
                'celery.webapp.chartConfigure' : {
                    'level' : 'INFO',
                    'handlers' : ['celery_chartConfigure'],
                    'propogate' : True,
                },
                'celery.webapp.register' : {
                    'level' : 'INFO',
                    'handlers' : ['celery_register'],
                    'propogate' : True,
                },
                'views.logger' : {
                    'level' : 'ERROR',
                    'handlers' : ['views.error'],
                    'propogate' : True,
                },
                'views.logger.login' : {
                    'level' : 'INFO',
                    'handlers' : ['views_login'],
                    'propogate' : True,
                },
                'views.logger.register' : {
                    'level' : 'INFO',
                    'handlers' : ['views_register'],
                    'propogate' : True,
                },
                'views.logger.chartConfigure' : {
                    'level' : 'INFO',
                    'handlers' : ['views_chartConfigure'],
                    'propogate' : True,
                },
                'views.logger.sendEmail' : {
                    'level' : 'INFO',
                    'handlers' : ['views_sendEmail'],
                    'propogate' : True,
                },
            },
    }
    

    但是,在执行doRollOver时仍然存在问题。

    不会在芹菜和Django之间拆分日志解决问题吗?因为访问日志的过程并不多,只有Django或Celery。

    编辑2:

    我也在进行Ajax调用。这会以某种方式产生另一个可能干扰日志记录的进程吗?

2 个答案:

答案 0 :(得分:14)

我猜您正面临这篇文章中描述的问题:Django logging with RotatingFileHandler error

也就是说,在运行Django开发服务器时,实际上有两个进程正在运行。

  

默认情况下,Django服务器的两个进程正在运行。一个是   实际的服务器,而另一个是检测代码的变化和   重新加载服务器。因此,settings.py导入两次,和   因此,这两个进程同时访问日志文件   时间。

正如那里所建议的那样,试试

python manage.py runserver --noreload

答案 1 :(得分:6)

如其他答案中所述python manage.py runserver --noreload将起作用。但是,这是另一个仍然适用于代码重新加载的解决方案。

在settings.py

的末尾添加此内容
if DEBUG and os.environ.get('RUN_MAIN', None) != 'true':
    LOGGING = {}

python manage.py runserver启动一个python进程,在子python进程中启动你的服务器。每次父母检测到更改时,它都会重新创建一个新孩子。问题是子进程的日志轮换失败,因为父进程仍然具有该文件的句柄。此解决方案告诉父级没有日志文件。