6 Stimmen

Python-Protokollierung über mehrere Dateien

Ich habe durch die Logging-Modul-Dokumentation gelesen und während ich etwas offensichtlich verpasst haben kann, der Code, den ich habe, scheint nicht zu funktionieren, wie beabsichtigt. Ich bin mit Python 2.6.4.

Mein Programm besteht aus mehreren verschiedenen Python-Dateien, von denen ich Logging-Meldungen an eine Textdatei und möglicherweise an den Bildschirm senden möchte. Ich nehme an, dies ist eine gemeinsame Sache zu tun, so dass ich dies irgendwo durcheinander.

Was mein Code im Moment macht, ist die korrekte Protokollierung in der Textdatei, irgendwie. Aber die Protokollierung auf dem Bildschirm wird dupliziert, eine mit der angegebenen Formatierung, und eine ohne. Auch, wenn ich die Bildschirmausgabe deaktivieren, ich bin immer noch den Text einmal gedruckt, die ich nicht will - ich will nur, dass es in die Datei protokolliert werden.

Wie auch immer, etwas 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)

Das ist nichts Ungewöhnliches.

#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 dies 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 Textdatei die korrekt formatierte Ausgabe erhält, wird beim Ausschalten der Bildschirmaufzeichnung in logger.py weiterhin die falsch formatierte Ausgabe angezeigt.

Nach dem, was ich aus den Dokumenten verstehe, sollte der Aufruf von corelog.debug(), da corelog ein Kind des "stumbler"-Loggers ist, diese Formatierung verwenden und die Protokolle als solche ausgeben.

Ich entschuldige mich für den Aufsatz über ein so triviales Thema.

TL;DR: Wie führe ich die Protokollierung von mehreren Dateien durch?

12voto

Nick Punkte 136

Sind Sie sicher, dass in den von Ihnen importierten Daten keine anderen Protokollierungseinstellungen vorgenommen werden?

Die fehlerhafte Ausgabe in Ihren Konsolenprotokollen sieht aus wie die Standardkonfiguration für einen Logger, so dass dies möglicherweise durch etwas anderes verursacht wird.

Ich führe dieses schnelle Testskript aus:

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...")

führt zu diesem Ergebnis:

2010-01-08 15:39:25,335 - DEBUG :: Botschaften und Regenbögen...

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 :: Meldungen und Regenbögen...

Dies funktionierte wie erwartet, wenn ich es in Python 2.4, 2.5 und 2.6.4 ausgeführt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X