Frage

Ich habe eine Website in Django ausgeführt.Frontend ist lighttpd und ist mit fcgi host django.

Ich fange meine fcgi Prozesse wie folgt:

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

Für die Anmeldung, ich habe eine RotatingFileHandler wie folgt definiert:

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

Die Protokollierung läuft.Aber es sieht aus wie die Dateien zu drehen, wenn Sie nicht sogar bis zu 10Kb, geschweige denn 10Mb.Meine Vermutung ist, dass jedes fcgi-Instanz ist nur die Handhabung 10-Anforderungen, und dann re-spawnen.Jeder respawn fcgi eine neue Datei erstellt.Ich bestätige, dass fcgi Anlauf unter dem neuen Prozess-id jeder so oft (schwer zu sagen, mal genau so, aber unter einer minute).

Gibt es eine Möglichkeit, dies zu umgehen, Probleme?Ich möchte alle fcgi-Instanzen-Protokollierung in einer Datei, bis es erreicht die maximale Größe, an welcher Stelle eine log-Datei rotation stattfinden würde.

War es hilfreich?

Lösung

Alex erklärte, der Protokollierung ist thread-sicher, aber der standard-Handler kann nicht sicher verwendet werden, um zu protokollieren, die von mehreren Prozessen in einer einzigen Datei.

ConcurrentLogHandler verwendet die Datei sperren, damit zum protokollieren aus mehreren Prozessen.

Andere Tipps

In Ihren Schuhen würde ich wechseln zu einer TimedRotatingFileHandler - Ich bin überrascht, dass die Größe-basierten rotierenden Datei-handles geben dieses problem (wie es sein sollte unempfindlich gegen welche Prozesse der Herstellung der log-Einträge), aber die getaktete version (wenn auch nicht kontrolliert genau auf den parameter, den Sie bevorzugen) sollte es lösen.Oder schreiben Sie Ihren eigenen, mehr Feste, rotierenden Datei-handler (man kann nehmen viel von der standard-Bibliothek Quellen), dass gewährleistet unterschiedliche Prozesse sind kein problem (wie Sie nie werden sollte).

Als Sie zu sein scheinen, mit dem Standard-Datei öffnen-Modus append ("a"), anstatt zu schreiben ("w"), wenn ein Prozess re-spawns es sollte angefügt werden, die vorhandene Datei, dann rollover, wenn die maximale Größe erreicht ist.Also bin ich nicht sicher, dass das, was Sie sehen, ist verursacht durch re-Laich-CGI-Prozesse.(Dies ist natürlich davon ausgegangen, dass der Dateiname bleibt derselbe, wenn der Prozess re-spawns).

Obwohl die logging-Paket ist thread-sicher, es behandelt nicht den gleichzeitigen Zugriff auf dieselbe Datei von mehreren Prozessen - denn es gibt keine standard-Weg, dies zu tun in der stdlib.Meine normale Beratung ist die Einrichtung eines separaten daemon-Prozess implementiert, die eine socket-server und protokolliert Ereignisse, die auf es-Datei - die anderen Prozesse dann einfach implementieren eine SocketHandler zu kommunizieren, die mit der logging-daemon.Dann werden alle Ereignisse erhalten serialisierte auf die Festplatte ordnungsgemäß.Die Python-Dokumentation enthält eine arbeiten-socket-server das könnte als Grundlage dienen, für die dies benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top