Question

J'ai un site en cours d'exécution dans Django. Frontend est lighttpd et utilise fcgi pour héberger django.

Je lance mes processus fcgi comme suit:

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

Pour la journalisation, j'ai un RotatingFileHandler défini comme suit:

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

La journalisation fonctionne. Cependant, il semble que les fichiers tournent alors qu’ils ne dépassent même pas 10 Ko, encore moins 10 Mo. Je suppose que chaque instance fcgi ne traite que 10 requêtes, puis se reproduit. Chaque respawn de fcgi crée un nouveau fichier. Je confirme que fcgi démarre régulièrement sous un nouvel identifiant de processus (difficile d'indiquer l'heure avec précision, mais moins d'une minute).

Existe-t-il un moyen de résoudre ce problème? Je souhaite que toutes les instances fcgi soient consignées dans un fichier jusqu'à ce que la taille limite soit atteinte, ce qui entraînera une rotation du fichier journal.

Était-ce utile?

La solution

Comme Alex l'a indiqué, la journalisation est sécurisée pour les threads, mais les gestionnaires standard ne peuvent pas être utilisés en toute sécurité pour consigner de multiples processus dans un seul fichier.

ConcurrentLogHandler utilise le verrouillage de fichier pour permettre la journalisation à partir de plusieurs processus.

Autres conseils

À votre place, je passerais à un TimedRotatingFileHandler - - Je suis surpris que les descripteurs de fichiers rotatifs basés sur la taille posent ce problème (car ils doivent être insensibles aux processus produisant les entrées de journal), mais la version temporisée (bien que non contrôlée avec exactement le paramètre que vous préférez) devrait résoudre il. Ou bien, écrivez votre propre gestionnaire de fichiers en rotation, plus solide et plus solide (vous pouvez prendre beaucoup des sources de bibliothèque standard) que garantit que la variation des processus ne pose pas de problème (comme ils ne devraient jamais l'être).

Comme vous semblez utiliser le mode d'ouverture de fichier par défaut append ("a") plutôt qu'écrire ("w"), si un processus réapparaît, il doit être ajouté au fichier existant, puis survolez le la limite de taille est atteinte. Je ne suis donc pas sûr que ce que vous voyez soit causé par la régénération des processus CGI. (Cela suppose bien sûr que le nom du fichier reste le même lorsque le processus se reproduit).

Bien que le package de journalisation soit sécurisé pour les threads, il ne gère pas l'accès simultané au même fichier à partir de plusieurs processus, car il n'existe pas de méthode standard pour le faire dans stdlib. Mon conseil habituel est de configurer un processus démon distinct qui implémente un serveur de socket et enregistre dans un fichier les événements reçus. Les autres processus implémentent alors un gestionnaire de sockets pour communiquer avec le démon de journalisation. Ensuite, tous les événements seront sérialisés sur le disque correctement. La documentation Python contient un travail serveur de socket qui pourrait servir de base à ce besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top