2010-11-30 51 views
1

J'ai un script python qui lance un certain nombre de processus utilisateur en utilisant subprocess.Popen. Chaque processus stdout est redirigé vers un fichier unique. Par exemple, le je lance chaque processus comme suitRediriger stdout de plusieurs processus vers le module de journalisation python

proc = my_proc 
for p in range(1, max_p, 1): 
    log_file = proc + "_" + str(p) + ".log" 
    log = open(log_file, "w+") 
    subprocess.Popen([my_proc, p], shell = False, stdout = log) 

Je voudrais tourner ces fichiers quand ils deviennent trop gros. Quelle serait la meilleure façon de le faire? Je voudrais utiliser le module d'enregistrement mais je ne pense pas que c'est son utilisation prévue

Merci

Répondre

0

Que diriez-vous logging.handlers.RotatingFileHandler?

+0

de Merci, mais je besoin d'un enregistreur pour chaque processus. Est-ce possible avec cette classe? – mikip

+0

Cela devrait être possible si vous avez un identifiant pour chaque processus - alors vous pouvez faire l'id dans le nom de fichier. –

1

Pas une solution pythonique; mais sur les systèmes Linux, je préfère utiliser logrotate pour faire pivoter automatiquement mes journaux. Vérifiez si c'est installé sur votre système (Sur Ubuntu dire qu'il y a un répertoire appelé /etc/logrotate.d/ avec des fichiers lancés automatiquement via cron). Cela peut être préférable ou non à la rotation du journal à partir de l'application.

Il est très configurable, par exemple, permet la compression de fichiers plus anciens conserve N fichiers via rotation commande N, tourne lorsque le cron sur "taille 100k", et en regardant man logrotate, son très simple à configurer.

De la page de manuel est ici un exemple de fichier

# sample logrotate configuration file 
    compress 

    /var/log/messages { 
     rotate 5 
     weekly 
     postrotate 
      /usr/bin/killall -HUP syslogd 
     endscript 
    } 

    "/var/log/httpd/access.log" /var/log/httpd/error.log { 
     rotate 5 
     mail [email protected] 
     size 100k 
     sharedscripts 
     postrotate 
      /usr/bin/killall -HUP httpd 
     endscript 
    } 
+0

Merci, mais il peut y avoir jusqu'à 100 processus lancés à partir du script python. Aurais-je besoin d'une entrée pour chaque processus et fichier journal? – mikip

+0

Vous n'avez pas besoin d'entrées pour chaque processus/fichier journal - il prend en charge les caractères génériques. Par exemple, si tous vos journaux sont stockés dans un répertoire /var/log/some_app/*.log peut être utilisé pour faire pivoter tous les fichiers journaux dans ce répertoire. C'est en fait le troisième exemple, que j'ai coupé. –