我和Django的RotatingFileHander有问题.
问题是,当文件达到maxBytes大小时,它不会创建新文件,并在您尝试执行logger.info("任何消息")时给出错误消息:
奇怪的是:
记录器只在文件顶部启动一次(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
Run Code Online (Sandbox Code Playgroud)在我的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,
},
},
}
Run Code Online (Sandbox Code Playgroud)
我试图改变不同的文件大小,但它被卡在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,
},
},
}
Run Code Online (Sandbox Code Playgroud)
但是,在执行doRollOver时仍然存在问题.
不会在芹菜和Django之间拆分日志来解决问题吗?因为访问日志不是几个进程,而只是Django或Celery.
编辑2:
我也在做Ajax调用.这会以某种方式产生另一个可能干扰日志记录的进程吗?
jal*_*aba 16
我想你正面临着这篇文章中描述的问题:使用RotatingFileHandler错误的Django日志记录
也就是说,在运行Django开发服务器时,实际上有两个进程在运行.
默认情况下,Django服务器的两个进程正在运行.一个是实际的服务器,另一个是检测代码中的更改并重新加载服务器.因此,settings.py被导入两次,因此两个进程同时访问日志文件.
在那里建议,试试
python manage.py runserver --noreload
Run Code Online (Sandbox Code Playgroud)
正如其他答案中所描述的那样python manage.py runserver --noreload.但这是另一个仍然适用于代码重载的解决方案.
在settings.py的末尾添加它
if DEBUG and os.environ.get('RUN_MAIN', None) != 'true':
LOGGING = {}
Run Code Online (Sandbox Code Playgroud)
python manage.py runserver启动一个python进程,在子python进程中启动你的服务器.每次父母检测到更改时,它都会重新创建一个新孩子.问题是子进程的日志轮换失败,因为父进程仍然具有该文件的句柄.此解决方案告诉父级没有日志文件.
| 归档时间: |
|
| 查看次数: |
6357 次 |
| 最近记录: |