Django-当文件等于最大字节时,旋转文件处理程序卡住

2024-09-22 16:32:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Django的旋转文件处理程序有问题。

问题是,当文件达到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
    

在我的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之前,所有的日志记录都很好。

编辑:

我把伐木分为芹菜和姜果。

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,
            },
        },
}

然而,它仍然有问题做多洛弗。

在芹菜和姜果之间分割原木不会解决这个问题吗?因为访问日志的不是几个进程,而是Django或Celery。

编辑2:

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


Tags: infologtruelogginghandlersloggerlevelviews
2条回答

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

将此添加到设置的末尾.py

if DEBUG and os.environ.get('RUN_MAIN', None) != 'true':
    LOGGING = {}

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

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

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

by default, two processes of Django servers are running. One is the actual server, while the other is to detect changes in the code and reload the server. Therefore, settings.py is imported twice, and consequently the two processes are accessing the log file at the same time.

按照那里的建议,试试

python manage.py runserver --noreload

相关问题 更多 >