這些IO錯誤是衆所周知的,正如在其他SO線程中看到的(見下文),並且可能是由用戶在瀏覽器中間關閉時導致的。有關爲什麼沒有簡單解決方案的討論,請參見this django-developers thread。抑制Django mod_wsgi IO錯誤
我第一次嘗試了在this ioerror SO thread的回答中描述的中間件選項(除了在我們的情況下,我會在請求uri上分支)。 它沒有工作:我可以捕捉到響應,並看到就Django而言,文章中沒有包含文件,並且它返回了帶有驗證錯誤的200響應。 但是,我仍然可以在Apache的錯誤日誌中看到IOError。
接下來我們發現this discussion on a django bug這表明你應該用記錄過濾器來壓制這個。我試着將過濾器附加到我們的自定義記錄器,根記錄器和'django.request'...我仍然無法看到IOError壓制它!我只能看到與表單失敗驗證相關的日誌消息。
有什麼建議嗎?
[編輯:這裏是我的設置]
在settings.py(主要來自Django的conf/global_settings.py
複製):ioerr_filter.py的
DEBUG = False
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'ioerrsquash': {
'()': 'es.ioerr_filter.IOErrorFilter'
} },
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['ioerrsquash']
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'wsgi.errors': { # added this logger after django.request failed
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}
內容(顯然只是爲了測試目的):
import logging
import sys
from django.conf import settings
class IOErrorFilter(logging.Filter):
def filter(self, record):
LOGF = "%s/BU_IOERR.log" % settings.LOG_FILE_DIR
f = open(LOGF, 'a')
f.write('... record\n')
f.write(str(record))
f.write('\n... exc_info\n')
f.write(str(sys.exc_info()))
f.write('\n...\n')
return True
感謝馬克,是的,我用#17069作爲日誌過濾器的模板。正如我所提到的,我將過濾器附加到root和兩個命名記錄器(django.request) - 但我沒有看到錯誤消失。在我的測試中,我刪除了所有條件(例如'def filter(self,record):f = open('test.log','a'); f.write(str(record))')...和I查看其他日誌消息,但不是IOError。 – EMiller 2012-02-22 17:06:30
如果您發佈了您在日誌配置和自定義過濾器代碼方面嘗試過的內容,這將會很有幫助。 – 2012-02-22 18:07:06
編輯的問題,謝謝 – EMiller 2012-02-23 14:45:35