2009-07-30 5 views
5

장고에서 실행중인 사이트가 있습니다. 프론트 엔드는 lighttpd이며 fcgi를 사용하여 django를 호스팅합니다. 다음과 같이Django 및 fcgi - 로깅 질문

내있는 fcgi 프로세스를 시작합니다

python2.6 /<snip>/manage.py runfcgi maxrequests=10 host=127.0.0.1 port=8000 pidfile=django.pid 

로깅을 위해, 나는 다음과 같이 RotatingFileHandler 정의가 : 로깅이 작동

file_handler = RotatingFileHandler(filename, maxBytes=10*1024*1024, backupCount=5,encoding='utf-8') 

합니다. 그러나 파일이 10Kb까지 올라간다해도 회전하지 않는 것 같습니다. 10Mb는 물론입니다. 내 생각 엔 각 fcgi 인스턴스는 10 개의 요청 만 처리하고 다시 생성합니다. fcgi의 각 respawn은 새로운 파일을 생성합니다. 나는 fcgi가 새로운 프로세스 ID로 시작될 때마다 매우 자주 (시간을 정확하게 말하기는 어렵지만 1 분 미만으로) 어렵다는 것을 확인합니다.

이 문제를 해결할 수있는 방법이 있습니까? 모든 fcgi 인스턴스가 크기 제한에 도달 할 때까지 하나의 파일에 로깅하려고합니다.이 시점에서 로그 파일 회전이 발생합니다.

답변

6

로깅은 스레드로부터 안전하지만 표준 핸들러는 여러 프로세스에서 단일 파일로 안전하게 기록 할 수 없습니다.

ConcurrentLogHandler은 파일 잠금을 사용하여 여러 프로세스 내에서 로깅을 허용합니다.

2

신발에서 나는 TimedRotatingFileHandler으로 전환 할 것입니다. 크기에 따라 회전하는 파일 핸들이이 문제를 일으키고 있습니다 (프로세스가 로그 항목을 생성하는 데 영향을주지 않아야 함). (비록 당신이 선호하는 매개 변수로 제어되지는 않지만) 그것을 해결해야한다. 또는 변화하는 프로세스가 문제가되지 않을 것임을 보장하는 자신 만의 견고한 회전식 파일 처리기 (표준 라이브러리 소스에서 많이 가져올 수 있음)를 작성하십시오.

0

write ("w")가 아닌 append ("a")의 기본 파일 열기 모드를 사용하고있는 것처럼 프로세스가 다시 생성되면 기존 파일에 추가해야하며, 한계에 도달했습니다. 그래서 당신이보고있는 것이 CGI 프로세스를 재 스폰함으로써 야기 된 것인지 확신 할 수 없습니다. (물론 이것은 프로세스가 다시 생성 될 때 파일 이름이 동일하게 유지된다고 가정합니다).

로깅 패키지는 스레드로부터 안전하지만 여러 프로세스에서 동일한 파일에 대한 동시 액세스를 처리하지 않습니다. stdlib에서이를 수행하는 표준 방법이 없기 때문입니다. 나의 일반적인 충고는 소켓 서버를 구현하고 그것을 가로 질러 수신 된 이벤트를 파일에 기록하는 별도의 데몬 프로세스를 설정하는 것이다. 다른 프로세스는 로깅 데몬과 통신하기 위해 SocketHandler를 구현한다. 그러면 모든 이벤트가 디스크에 제대로 직렬화됩니다. 파이썬 문서에는 working socket server이 들어 있는데,이 필요성의 기초가 될 수 있습니다.