문제

Django에서 실행중인 사이트가 있습니다. Frontend는 LightTPD이며 FCGI를 사용하여 Django를 호스트합니다.

FCGI 프로세스를 다음과 같이 시작합니다.

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

로깅의 경우 회전 파일 핸들러가 다음과 같이 정의되어 있습니다.

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

로깅이 작동합니다. 그러나 파일이 10MB는 물론 10KB까지까지까지는 파일이 회전하는 것처럼 보입니다. 내 생각에 각 FCGI 인스턴스는 10 개의 요청을 처리 한 다음 다시 구조화 될 것입니다. FCGI의 각 Respawn은 새 파일을 만듭니다. 나는 FCGI가 새로운 프로세스 ID에서 너무 자주 시작하고 있음을 확인합니다 (정확히 시간을 정확히 말하기 어렵지만 1 분 미만).

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

도움이 되었습니까?

해결책

Alex가 말했듯이 로깅은 스레드 안전이지만 표준 처리기는 여러 프로세스에서 단일 파일에 로그인하는 데 안전하게 사용될 수 없습니다.

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

다른 팁

당신의 신발에서 나는 a로 전환 할 것입니다 TimedRotatingFileAndler -크기 기반 회전 파일 핸들 이이 문제를 제시하고 있다는 사실에 놀랐습니다 (로그 항목을 생성하는 프로세스에 어떤 프로세스가 발생하지 않아야 함) 타임 버전 (정확히 원하는 매개 변수에서 제어되지 않음)은 그것을 해결하십시오. 또는 자신의,보다 견고하고 회전하는 파일 핸들러를 작성하십시오 (표준 라이브러리 소스에서 많은 것을 취할 수 있음) 보장합니다 다양한 프로세스는 문제가되지 않습니다 (절대 안되는 것은 아닙니다).

쓰기 ( "w") 대신 기본 파일 열기 모드 ( "A")를 사용하는 것처럼 보이면 프로세스가 다시 스폰되면 기존 파일에 추가 된 다음 크기 제한에 도달하면 롤오버가 필요합니다. 그래서 나는 당신이보고있는 것이 CGI 프로세스를 다시 구조화함으로써 발생하는지 확신하지 못합니다. (물론 이것은 프로세스가 다시 시작될 때 파일 이름이 동일하게 유지된다고 가정합니다).

로깅 패키지는 스레드 안전이지만 여러 프로세스에서 동일한 파일에 대한 동시 액세스를 처리하지 않습니다. stdlib에서는 표준 방법이 없기 때문입니다. 저의 일반적인 조언은 소켓 서버를 구현하는 별도의 데몬 프로세스를 설정하는 것입니다. 소켓 서버와 로그를 파일로 통과하는 이벤트를 구현하는 것입니다. 다른 프로세스는 양말을 구현하여 로깅 데몬과 통신합니다. 그러면 모든 이벤트가 디스크로 직렬화됩니다. 파이썬 문서에는 a가 포함되어 있습니다 작업 소켓 서버 이 요구의 기초가 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top