2009-07-30 15 views
5

Mam stronę działającą w Django. Frontend jest lighttpd i używa fcgi do hostowania django.Django i fcgi - logowanie pytanie

zacznę moje procesy fcgi następująco:

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

do logowania, mam RotatingFileHandler zdefiniowane następująco:

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

Rejestrowanie działa. Wygląda jednak na to, że pliki obracają się, gdy nie osiągają nawet 10 KB, a co dopiero 10 MB. Domyślam się, że każda instancja fcgi obsługuje tylko 10 żądań, a następnie ponownie się odradza. Każde odrodzenie fcgi tworzy nowy plik. Potwierdzam, że fcgi uruchamia się pod nowym identyfikatorem procesu co jakiś czas (trudno dokładnie określić czas, ale niecałą minutę).

Czy istnieje sposób na obejście tego problemu? Chciałbym, aby wszystkie instancje fcgi logowały się do jednego pliku, dopóki nie osiągną limitu rozmiaru, w którym to momencie nastąpi rotacja pliku dziennika.

Odpowiedz

6

Jak stwierdził Alex, logowanie jest bezpieczne dla wątków, ale standardowe procedury obsługi nie mogą być bezpiecznie używane do rejestrowania wielu procesów w jednym pliku.

ConcurrentLogHandler używa blokowania plików, aby umożliwić logowanie z wielu procesów.

2

W twoich butach przełączyłem się na TimedRotatingFileHandler - Jestem zaskoczony, że obsługiwane są obracające się na plikach uchwyty oparte na rozmiarach (ponieważ nie powinny być odporne na to, jakie procesy generują wpisy dziennika), ale Wersja czasowa (choć nie kontrolowana dokładnie według preferowanego parametru) powinna go rozwiązać. Możesz też napisać własną, bardziej stabilną, obracającą się obsługę plików (możesz pobrać dużo ze standardowych źródeł biblioteki), która zapewnia, że ​​różne procesy nie stanowią problemu (tak jak nigdy nie powinny być).

0

Ponieważ wydaje się, że korzystasz z domyślnego trybu otwierania plików ("a") zamiast zapisywania ("w"), jeśli proces ponownie się spawn powinien zostać dołączony do istniejącego pliku, a następnie najedź, gdy rozmiar limit został osiągnięty. Nie jestem więc pewien, czy to, co widzisz, spowodowane jest ponownym spawaniem procesów CGI. (To oczywiście zakłada, że ​​nazwa pliku pozostaje taka sama, gdy proces ponownie się odradza).

Chociaż pakiet logowania jest bezpieczny dla wątków, nie obsługuje on równoczesnego dostępu do tego samego pliku z wielu procesów - ponieważ nie ma standardowego sposobu wykonania tego w pliku STDLIB. Moja normalna rada polega na skonfigurowaniu oddzielnego procesu demona, który implementuje serwer gniazd i rejestruje zdarzenia odebrane przez niego do pliku - inne procesy następnie po prostu implementują SocketHandler do komunikacji z demonem rejestrowania. Następnie wszystkie zdarzenia zostaną poprawnie zserializowane na dysk. Dokumentacja w języku Python zawiera working socket server, która może służyć jako podstawa tej potrzeby.

Powiązane problemy