2010-01-08 8 views
6

Ich habe die Dokumentation des Logging-Moduls gelesen und während ich etwas offensichtlich übersehen habe, scheint der Code, den ich habe, nicht wie vorgesehen zu funktionieren. Ich benutze Python 2.6.4.Python Logging über mehrere Dateien

Mein Programm besteht aus mehreren verschiedenen Python-Dateien, von denen ich Logging-Nachrichten an eine Textdatei und möglicherweise den Bildschirm senden möchte. Ich stelle mir vor, das ist eine gewöhnliche Sache, ich mache das irgendwo durcheinander.

Was mein Code zur Zeit tut, ist korrekt in die Textdatei einzuloggen, irgendwie. Die Protokollierung auf dem Bildschirm wird jedoch dupliziert, eine mit der angegebenen Formatierung und eine ohne. Wenn ich die Bildschirmausgabe ausschalte, bekomme ich den Text immer noch einmal gedruckt, was ich nicht möchte - ich möchte nur, dass er in der Datei gespeichert wird.

Wie auch immer, einige Code:

#logger.py 
import logging 
from logging.handlers import RotatingFileHandler 
import os 

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):   
    logdir = os.path.abspath(logdir) 

    if not os.path.exists(logdir): 
     os.mkdir(logdir) 

    log = logging.getLogger('stumbler') 
    log.setLevel(loglevel) 

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s") 

    if txtlog: 
     txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5) 
     txt_handler.doRollover() 
     txt_handler.setFormatter(log_formatter) 
     log.addHandler(txt_handler) 
     log.info("Logger initialised.") 

    if scrnlog: 
     console_handler = logging.StreamHandler() 
     console_handler.setFormatter(log_formatter) 
     log.addHandler(console_handler) 

Nichts dort ungewöhnlich.

#core.py 
import logging 
corelog = logging.getLogger('stumbler.core') # From what I understand of the docs, this should work :/ 

class Stumbler: 
    [...] 

    corelog.debug("Messages and rainbows...") 

Die Bildschirmausgabe zeigt, wie diese dupliziert wird:

2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3 
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3 
2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe 
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe 

Obwohl die Text-Datei, die korrekt formatierte Ausgabe wird immer, um den Bildschirm Protokollierung in logger.py ausschalten noch die falsch formatierte Ausgabe angezeigt .

Von dem, was ich von den Dokumenten verstehe, Aufruf von corelog.debug(), da Corelog ein Kind der "Stolpern" Logger ist, sollte es diese Formatierung verwenden und die Protokolle als solche ausgeben.

Entschuldigung für den Aufsatz über solch eine triviale Frage.

TL; DR: Wie protokolliere ich mehrere Dateien?

Antwort

12

Sind Sie sicher, dass kein anderes Protokollierungssetup in etwas vorgenommen wird, das Sie importieren.

Die falsche Ausgabe in Ihren Konsolenprotokollen sieht wie die Standardkonfiguration für einen Protokollierer aus, also könnte etwas anderes das einrichten.

Ausführen dieses schnelle Testskript:

import logging 
from logging.handlers import RotatingFileHandler 
import os 

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG): 
    logdir = os.path.abspath(logdir) 

    if not os.path.exists(logdir): 
     os.mkdir(logdir) 

    log = logging.getLogger('stumbler') 
    log.setLevel(loglevel) 

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s") 

    if txtlog: 
     txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5) 
     txt_handler.doRollover() 
     txt_handler.setFormatter(log_formatter) 
     log.addHandler(txt_handler) 
     log.info("Logger initialised.") 

    if scrnlog: 
     console_handler = logging.StreamHandler() 
     console_handler.setFormatter(log_formatter) 
     log.addHandler(console_handler) 



setup_logging('/tmp/logs') 
corelog = logging.getLogger('stumbler.core') 
corelog.debug("Messages and rainbows...") 

ergibt dieses Ergebnis:

2010-01-08 15: 39: 25.335 - DEBUG :: Nachrichten und Regenbogen ...

und in meinem /tmp/logs/Stumbler.log

2010-01-08 15: 39: 25,335 - INFO :: Logger initialisiert. 2010-01-08 15: 39: 25.335 - DEBUG :: Nachrichten und Regenbogen ...

Das wie erwartet funktioniert, wenn ich es lief in Python 2.4, 2.5 und 2.6.4

+1

Wow , Spot auf. Ich hatte logging.basicConfig() wird immer noch in einigen meiner anderen Module verwendet. Es ist mir NIEMALS eingefallen, dass sie die Probleme verursachen könnten. Vielen Dank! – Loix0