2011-03-16 6 views
1

장고를 사용하여 데이터베이스 쓰기와 관련된 요청 별 로깅을 수행해야합니다.Django에서 요청 당 "Lazy-write"로깅하는 방법은 무엇입니까?

Django의 process_request()process_response() 미들웨어 후크를 이해하지만, 내가 알 수있는 한, 그 고리는 웹 페이지 응답 렌더링을위한 중요한 경로 (의도적으로)에 있습니다.

포스트 - 요청 데이터베이스 쓰기 작업이 페이지의 응답 시간을 초과하지 않는 것을 선호합니다.

Django의 간단한 디자인 패턴을 통해 요청 처리 중에 요청 훅을 사용하여 후속 작업과 실제 로그 쓰기 작업을 수행 할 수있는 "지연 로그 쓰기"를 수행 할 수 있습니까? 응답이 사용자에게 쓰여질 때까지 발생합니까?

현재 WSGI를 사용하고 있지만 가능한 가장 일반적인 솔루션을 선호합니다.

+0

한 가지 대안은 쓰기를 버퍼링하는 logging.Handler를 사용하는 것입니다. 아마 "진짜"핸들러에 쓸시기를 알 수 있도록 flush()를 주면됩니다. –

+0

또한보십시오 http://stackoverflow.com/q/4313508/621690 – Risadinha

답변

5

Django는 응답 처리가 끝난 후 실행되는 request_finished -signal을 구현하지만 아래쪽은 현재 request 객체에 액세스 할 수 없으므로 로깅에별로 도움이되지 않습니다. django의 응답 처리를위한 최신 장소는 HttpResponse class itself입니다. 예. 데이터를 request.session에 일시적으로 저장하고 close() 방법으로 데이터베이스에 씁니다.

하지만 다른 대안을 고려해야합니다. Celery과 같은 것을 사용하여 로깅 작업을 비동기 적으로 처리 할 수 ​​있습니다. 또한 MongoDB과 같은 비 SQL 데이터베이스가있어 로깅을위한 편리하고 효율적인 기능을 제공합니다. you dont have to wait until the changes are really committed을 데이터베이스에 연결하면 큰 성능 이점을 얻을 수 있습니다.

+1

신호는 실제로 in-process 실행되지만, 비동기 솔루션으로 Celery에 +1합니다. –

+0

자, 코드베이스에서 신호를 찾았습니다. WSGI 핸들러가 응답을 보내기 전에 신호가 보내 지지만 신호의 이름이 뭔가를 제안 할 수도 있습니다. 관심있는 모든 분들께 : http://code.djangoproject.com/browser/django/trunk/django/core/handlers/wsgi.py#L275 –

관련 문제