2010-11-30 13 views
1

Ich habe ein Python-Skript, das eine Reihe von Benutzerprozessen mit subprocess.Popen startet. Jedes Prozessstdout wird zu einer eindeutigen Datei umgeleitet. Zum Beispiel starten die ich jeden Prozess alsStdout von mehreren Prozessen an Python umleiten Logging-Modul

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) 

folgt würde Ich mag diese Dateien drehen, wenn sie zu groß geworden. Was wäre der beste Weg dies zu tun? Ich möchte das Protokollierungsmodul verwenden, aber ich glaube nicht, dass dies die beabsichtigte Verwendung ist

Dank

Antwort

0

Wie wäre es logging.handlers.RotatingFileHandler?

+0

Danke, aber ich brauche einen Logger für jeden Prozess. Ist das mit dieser Klasse möglich? – mikip

+0

Es sollte möglich sein, wenn Sie für jeden Prozess eine ID haben - dann können Sie die ID in den Dateinamen backen. –

1

Keine pythische Lösung; Aber auf Linux-Systemen bevorzuge ich die Verwendung von Logrotate, um meine Logs automatisch zu rotieren. Überprüfen Sie, ob es auf Ihrem System installiert ist (Auf ubuntu steht, gibt es ein Verzeichnis namens /etc/logrotate.d/ mit Dateien automatisch über Cron ausgeführt). Dies kann oder sollte nicht bevorzugt werden, wenn eine Protokollrotation innerhalb der Anwendung ausgeführt wird.

Es ist sehr konfigurierbar, z. B. ermöglicht die Komprimierung von älteren Dateien hält N-Dateien über N-Befehl drehen, dreht, wenn der Cron über "Größe 100k", und Blick auf Mann logrotate, ist sehr einfach einzurichten.

Aus der Manpage ist hier eine Beispieldatei

# 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

Danke, aber es kann bis zu 100 Prozesse aus dem Python-Skript gestartet werden. Benötige ich einen Eintrag für jeden Prozess und jedes Logfile? – mikip

+0

Sie benötigen keine Einträge für jeden Prozess/Logfile - es unterstützt Platzhalter. Wenn beispielsweise alle Protokolle in einem Verzeichnis /var/log/some_app/*.log gespeichert sind, können alle Protokolldateien in diesem Verzeichnis rotiert werden. Das ist das dritte Beispiel, das ich abgeschnitten habe. –