2011-03-16 60 views
1

使用Django,我需要做一些涉及數據庫寫入的每個請求日誌記錄。如何在Django中使用「Lazy-write」每個請求日誌記錄?

我明白Django的process_request()process_response()中間件掛鉤,但據我所知,這些掛鉤處於呈現網頁響應的關鍵路徑(通過設計)。

我不希望我的請求後數據庫寫入操作保持頁面的響應時間。

Django有一個簡單的設計模式,可以讓我做一個「懶惰的日誌寫入」,我可以在請求處理期間使用請求鉤子來收集信息,但是任何後續操作和實際的日誌寫入操作都不會直到響應寫入用戶之後纔會發生?

我目前正在使用WSGI,但寧願使用最通用的解決方案。

+0

一種替代方法是使用緩衝寫入的logging.Handler。也許給它一個flush(),以便你可以告訴它什麼時候寫入「真實」處理程序。 – 2011-03-16 22:37:10

+0

另請參見http://stackoverflow.com/q/4313508/621690 – Risadinha 2017-05-08 19:00:21

回答

5

Django的實現request_finished - 信號響應的處理已經完成之後被解僱,但不好的一面是,它不會允許你訪問當前request對象這使得它不太對記錄有用的.. 。最近掛入django的響應處理的地方很可能在HttpResponse class itself。你可以例如。將數據臨時存儲在request.session中,並將它們寫入數據庫的close()方法中。

但我想還有其他的選擇你應該考慮:你可以使用類似Celery異步處理你的日誌記錄任務。此外,還有非sql數據庫,例如MongoDB,可爲您提供便捷和高性能的日誌記錄功能,例如。 you dont have to wait until the changes are really committed到數據庫可以給你一個很大的性能優勢。

+1

信號實際上是在進程內執行的,但對於Celery而言,它是一個異步解決方案。 – 2011-03-16 21:29:25

+0

那麼你是對的,在代碼庫中查看它,在WSGI處理程序返回響應之前發送信號,儘管信號的名稱可能會提示其他信息。感興趣的人:http://code.djangoproject.com/browser/django/trunk/django/core/handlers/wsgi.py#L275 – 2011-03-16 21:44:30

相關問題