Python-Logging-Modul

In der Programmierung ist Logging ein sehr wichtiges Werkzeug. Es hilft uns, den Ausführungsstatus von Programmen zu verfolgen, Fehler zu debuggen und wichtige Informationen aufzuzeichnen.

Python bietet ein integriertesloggingModul speziell für die Behandlung von Logging-Aufgaben. Verglichen mit einfachenprintAnweisungen,loggingdas Modul ist flexibler und leistungsfähiger und kann Logging-Anforderungen in verschiedenen Szenarien erfüllen.

Warum das logging-Modul verwenden?

  1. Flexibilität:loggingDas Modul ermöglicht es Ihnen, Log-Level, Formate und Ausgabeziele nach Bedarf festzulegen.
  2. Skalierbarkeit: Sie können Logs einfach an verschiedene Ziele wie Dateien, Konsole, Netzwerk usw. ausgeben.
  3. Strukturiertes Logging:loggingDas Modul unterstützt strukturiertes Logging und erleichtert die spätere Analyse und Verarbeitung.
  4. Leistungsoptimierung: Verglichen mitprint,loggingdas Modul wurde in Bezug auf die Leistung optimiert und ist für den Einsatz in Produktionsumgebungen geeignet.

Grundlegende Verwendung des logging-Moduls

1. Das logging-Modul importieren

Zuerst müssen wir importierenloggingdas Modul:

Beispiel

import logging

2. Log-Level konfigurieren

Der Log-Level wird verwendet, um die Ausführlichkeit von Logs zu steuern.loggingDas Modul bietet die folgenden Log-Level:

  • DEBUG: Detaillierte Debugging-Informationen, die normalerweise während der Entwicklung verwendet werden.
  • INFO: Informationen während des normalen Programmablaufs.
  • WARNING: Weist auf mögliche Probleme hin, aber das Programm kann weiterhin normal ausgeführt werden.
  • ERROR: Weist auf Fehler im Programm hin, wodurch einige Funktionen nicht ordnungsgemäß funktionieren.
  • CRITICAL: Weist auf schwerwiegende Fehler hin, die zum Absturz des Programms führen können.

Sie können den Log-Level mit dem folgenden Code festlegen:

Beispiel

logging.basicConfig(level=logging.DEBUG)

3. Logs aufzeichnen

Nach dem Festlegen des Log-Levels können Sie die folgenden Methoden verwenden, um Logs aufzuzeichnen:

Beispiel

logging.debug("Dies ist eine Debug-Meldung")
logging.info("Dies ist eine allgemeine Meldung")
logging.warning("Dies ist eine Warnmeldung")
logging.error("Dies ist eine Fehlermeldung")
logging.critical("Dies ist eine kritische Fehlermeldung")

4. Ausgabeformat der Logs

Sie könnenbasicConfigdie Methode zum Anpassen des Ausgabeformats der Logs. Zum Beispiel:

Beispiel

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

5. Logs in eine Datei ausgeben

Standardmäßig werden Logs auf der Konsole ausgegeben. Wenn Sie Logs in einer Datei speichern möchten, können Sie es wie folgt konfigurieren:

Beispiel

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    filename="app.log"
)

Erweiterte Verwendung des logging-Moduls

1. Verwendung mehrerer Logger

In großen Projekten müssen Sie möglicherweise unabhängige Logger für verschiedene Module oder Komponenten erstellen. Dies kann auf folgende Weise erreicht werden:

Beispiel

logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)

# Datei-Handler erstellen
file_handler = logging.FileHandler("my_logger.log")
file_handler.setLevel(logging.DEBUG)

# Konsolen-Handler erstellen
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# Logformat festlegen
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# Handler zum Logger hinzufügen
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# Logs aufzeichnen
logger.debug("Dies ist eine Debug-Nachricht")
logger.info("Dies ist eine allgemeine Nachricht")

2. Log-Filter

Sie können Filter verwenden, um zu steuern, welche Logs aufgezeichnet werden müssen. Zum Beispiel:

Beispiel

class MyFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.ERROR

logger.addFilter(MyFilter())

3. Log-Rotation

Wenn die Logdatei zu groß wird, können SieRotatingFileHandleroderTimedRotatingFileHandlerum Log-Rotation zu implementieren:

Beispiel

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)

Übliche Attribute und Methoden des logging-Moduls

1. Kernklassen

KlasseBeschreibungBeispiel
logging.LoggerLogger, wird zum Ausgeben von Logmeldungen verwendet (erhalten überlogging.getLogger(name)get)logger = logging.getLogger("my_logger")
logging.HandlerHandler, bestimmt das Ausgabeziel von Logs (wie Dateien, Konsole usw.)handler = logging.FileHandler("app.log")
logging.FormatterFormatter, steuert das Format der Logausgabeformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
logging.FilterFilter, dient der feineren Steuerung der Logaufzeichnungfilter = logging.Filter("module.name")

2. Häufige Methoden des Logger-Objekts

MethodeBeschreibungBeispiel
logger.setLevel(level)Log-Level festlegen (wie z. B.logging.DEBUG、logging.INFO)logger.setLevel(logging.DEBUG)
logger.debug(msg)DEBUG-Level-Logs aufzeichnenlogger.debug("调试信息")
logger.info(msg)INFO-Level-Logs aufzeichnenlogger.info("程序启动")
logger.warning(msg)WARNING-Level-Logs aufzeichnenlogger.warning("磁盘空间不足")
logger.error(msg)ERROR-Level-Logs aufzeichnenlogger.error("操作失败")
logger.critical(msg)CRITICAL-Level-Logs aufzeichnenlogger.critical("系统崩溃")
logger.addHandler(handler)Handler hinzufügenlogger.addHandler(handler)
logger.addFilter(filter)Filter hinzufügenlogger.addFilter(filter)

3. Häufige Handler-Typen

Handler-TypBeschreibungBeispiel
StreamHandlerAusgabe an einen Stream (wie z. B. Konsole)handler = logging.StreamHandler()
FileHandlerAusgabe in eine Dateihandler = logging.FileHandler("app.log")
RotatingFileHandlerLogs nach Dateigröße aufteilenhandler = logging.RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)
TimedRotatingFileHandlerLogs nach Zeit aufteilenhandler = logging.TimedRotatingFileHandler("app.log", when="midnight")
SMTPHandlerLogs per E-Mail sendenhandler = logging.SMTPHandler("mail.example.com", "[email protected]", "[email protected]", "Error Log")

4. Log-Level (Konstanten)

StufeWertBeschreibung
CRITICAL50Kritischer Fehler, das Programm kann möglicherweise nicht weiter ausgeführt werden
ERROR40Fehler, aber das Programm kann weiterhin ausgeführt werden
WARNING30Warnmeldung (Standardstufe)
INFO20Informationen zum Programmablauf
DEBUG10Debug-Informationen
NOTSET0Level des übergeordneten Loggers erben

5. Häufige Formatfelder des Formatters

FeldBeschreibungBeispielausgabe
%(asctime)sErstellungszeit des Logs2023-01-01 12:00:00,123
%(levelname)sLog-Level-NameINFO
%(message)sInhalt der Log-NachrichtProgram started successfully.
%(name)sLogger-Namemy_logger
%(filename)sDateiname, in dem das Log erzeugt wurdeapp.py
%(lineno)dZeilennummer, an der das Log erzeugt wurde42
%(funcName)sFunktionsname, in dem das Log erzeugt wurdemain

6. Schnellkonfigurationsmethoden

MethodeBeschreibungBeispiel
logging.basicConfig()Ein-Klick-Konfiguration von Log-Level, Handlern und Format (wird normalerweise am Programmeinstiegspunkt aufgerufen)logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')

Allgemeine Parameter:

  • level: Legt die Stufe des Root-Loggers fest

  • filename: Ausgabe in eine Datei

  • filemode: Dateimodus (wie z. B.'w'überschreiben)

  • format: Formatzeichenfolge

  • datefmt: Datumsformat (wie z. B."%Y-%m-%d %H:%M:%S")

Beispiel

1. Grundlegende Konfiguration

Beispiel

import logging

# Logging konfigurieren
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='app.log'
)

# Verwenden
logger = logging.getLogger("my_app")
logger.info("Programm gestartet")

2. Komplexe Konfiguration mit mehreren Handlern

Beispiel

import logging

# Einen Logger erstellen
logger = logging.getLogger("my_module")
logger.setLevel(logging.DEBUG)

# Konsolen-Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

# Datei-Handler
file_handler = logging.FileHandler("debug.log")
file_handler.setLevel(logging.DEBUG)

# Formatierung
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# Handler hinzufügen
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# Verwenden
logger.debug("Debug message")  # Nur in Datei schreiben
logger.warning("Warning!")  # Ausgabe sowohl auf Konsole als auch in Datei

3. Log-Aufteilung

Beispiel


from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    "app.log", maxBytes=1e6, backupCount=3  # 1MB pro Datei, 3 Backups behalten
)
logger.addHandler(handler)
Weitere Erweiterungen