2016-05-24 24 views
4

(Ich habe gesucht und nicht ein Duplikat für diese Frage gefunden, aber glücklich, anders bewiesen zu werden).Log Rotation - Python und Windows

Ich muss ein Protokoll aus einigen Python-Code drehen. Der Code läuft unter Windows (Server 2008 R2).

Anfangs verwendete ich TimedRotatingFileHandler (aus Python logging.handlers Paket), aber das funktioniert nicht, wie wir brauchen, aufgrund dessen, was ich verstehe, ist ein Problem mit Multi-Verarbeitung (subprocess.check_call wird verwendet, um eine andere Anwendung zu starten).

Ich habe ConcurrentLogHandler ausgecheckt, was aussieht, als könnte es den Job erledigen, aber ich bin ein bisschen besorgt, dass es seit 2013 nicht aktualisiert wurde (obwohl Probleme in letzter Zeit aufgeworfen wurden).

UPDATE: ein open bug (seit 2013) gibt an, dass ConcurrentLogHandler nicht mit Python funktioniert 2.7/Sie Windows. Bei der Protokollierung hängt der Code einfach.

Gibt es eine Best Practice Windows Lösung, die ich verwenden sollte?

+0

Es sieht aus wie der Fehler, den Sie beziehen, ist für ein Paket von Drittanbietern, nicht eine, die mit Python enthalten ist –

+1

Ich fand einen Kollegen, der einen Protokollserver verwendet, um dies zu arbeiten: https: //www.huyng .com/posts/python-logging-from-multiple-processes –

+1

Dies könnte auch nützlich sein - http://plumberjack.blogspot.com/2010/09/using-logging-with-multiprocessing.html –

Antwort

0

Vielleicht bin ich etwas fehlt, aber Logging-Modul kommt der Python mit einem RotatingFileHandler:

import logging 
import time 

from logging.handlers import RotatingFileHandler 

#---------------------------------------------------------------------- 
def create_rotating_log(path): 
    """ 
    Creates a rotating log 
    """ 
    logger = logging.getLogger("Rotating Log") 
    logger.setLevel(logging.INFO) 

    # add a rotating handler 
    handler = RotatingFileHandler(path, maxBytes=20, 
            backupCount=5) 
    logger.addHandler(handler) 

    for i in range(10): 
     logger.info("This is test log line %s" % i) 
     time.sleep(1.5) 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    log_file = r"c:\path\to\test.log" 
    create_rotating_log(log_file) 

Dieser arbeitete für mich mit Python 2.7 auf Windows feinen 7. Hier sind ein paar Links, die mehr ins Detail gehen :

+0

Ja - das (und TimedRototingFileHandler, was ich als Originalreqt für Logs verwendet habe, um jeden Tag zu rollen) funktioniert absolut gut, bis Sie mehrere Prozesse in den Mix werfen. Ein ähnliches Problem wurde im Jahr 2008 (https://bugs.python.org/issue4749) als Bug protokolliert (der später als kein Bug geschlossen wurde). In meinem Fall versucht mein Extraprozess nicht, in das Protokoll zu schreiben, aber wir sehen das gleiche Verhalten. Ich werde meine Frage aktualisieren, um diesen Punkt zu klären! – azp74

0

OK - das habe ich getan.

Da, was die Protokollierung betrifft Dinge nur Multithreading sind (zusätzlicher Prozess schreibt nicht in mein Protokoll) Ich habe Handkurbeln dies endete. Ich bin nicht begeistert von diesem Ansatz - erstellen Sie ein Threading Lock-Objekt, schließen Sie die Protokollierung (logging.shutdown - nicht begeistert darüber, wie die Doco sagt, um es beim Programm beenden aufrufen ...), verschieben Sie die Datei & starten wieder einloggen. Dann lassen Sie das Schloss los.

Es ist alles in einem Versuch/außer Block, so dass, wenn etwas schief geht, das Schloss freigegeben wird.

Tests zeigen an, dass dies die Anforderungen erfüllt.

Ruft das Aufrufen von logging.shutdown in diesem Kontext einige Auswirkungen auf, die mir nicht bekannt sind ?!