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?
- Flexibilität:
loggingDas Modul ermöglicht es Ihnen, Log-Level, Formate und Ausgabeziele nach Bedarf festzulegen. - Skalierbarkeit: Sie können Logs einfach an verschiedene Ziele wie Dateien, Konsole, Netzwerk usw. ausgeben.
- Strukturiertes Logging:
loggingDas Modul unterstützt strukturiertes Logging und erleichtert die spätere Analyse und Verarbeitung. - Leistungsoptimierung: Verglichen mit
print,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
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
3. Logs aufzeichnen
Nach dem Festlegen des Log-Levels können Sie die folgenden Methoden verwenden, um Logs aufzuzeichnen:
Beispiel
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
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
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.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
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
handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)
Übliche Attribute und Methoden des logging-Moduls
1. Kernklassen
| Klasse | Beschreibung | Beispiel |
|---|---|---|
logging.Logger | Logger, wird zum Ausgeben von Logmeldungen verwendet (erhalten überlogging.getLogger(name)get) | logger = logging.getLogger("my_logger") |
logging.Handler | Handler, bestimmt das Ausgabeziel von Logs (wie Dateien, Konsole usw.) | handler = logging.FileHandler("app.log") |
logging.Formatter | Formatter, steuert das Format der Logausgabe | formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') |
logging.Filter | Filter, dient der feineren Steuerung der Logaufzeichnung | filter = logging.Filter("module.name") |
2. Häufige Methoden des Logger-Objekts
| Methode | Beschreibung | Beispiel |
|---|---|---|
logger.setLevel(level) | Log-Level festlegen (wie z. B.logging.DEBUG、logging.INFO) | logger.setLevel(logging.DEBUG) |
logger.debug(msg) | DEBUG-Level-Logs aufzeichnen | logger.debug("调试信息") |
logger.info(msg) | INFO-Level-Logs aufzeichnen | logger.info("程序启动") |
logger.warning(msg) | WARNING-Level-Logs aufzeichnen | logger.warning("磁盘空间不足") |
logger.error(msg) | ERROR-Level-Logs aufzeichnen | logger.error("操作失败") |
logger.critical(msg) | CRITICAL-Level-Logs aufzeichnen | logger.critical("系统崩溃") |
logger.addHandler(handler) | Handler hinzufügen | logger.addHandler(handler) |
logger.addFilter(filter) | Filter hinzufügen | logger.addFilter(filter) |
3. Häufige Handler-Typen
| Handler-Typ | Beschreibung | Beispiel |
|---|---|---|
StreamHandler | Ausgabe an einen Stream (wie z. B. Konsole) | handler = logging.StreamHandler() |
FileHandler | Ausgabe in eine Datei | handler = logging.FileHandler("app.log") |
RotatingFileHandler | Logs nach Dateigröße aufteilen | handler = logging.RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3) |
TimedRotatingFileHandler | Logs nach Zeit aufteilen | handler = logging.TimedRotatingFileHandler("app.log", when="midnight") |
SMTPHandler | Logs per E-Mail senden | handler = logging.SMTPHandler("mail.example.com", "[email protected]", "[email protected]", "Error Log") |
4. Log-Level (Konstanten)
| Stufe | Wert | Beschreibung |
|---|---|---|
CRITICAL | 50 | Kritischer Fehler, das Programm kann möglicherweise nicht weiter ausgeführt werden |
ERROR | 40 | Fehler, aber das Programm kann weiterhin ausgeführt werden |
WARNING | 30 | Warnmeldung (Standardstufe) |
INFO | 20 | Informationen zum Programmablauf |
DEBUG | 10 | Debug-Informationen |
NOTSET | 0 | Level des übergeordneten Loggers erben |
5. Häufige Formatfelder des Formatters
| Feld | Beschreibung | Beispielausgabe |
|---|---|---|
%(asctime)s | Erstellungszeit des Logs | 2023-01-01 12:00:00,123 |
%(levelname)s | Log-Level-Name | INFO |
%(message)s | Inhalt der Log-Nachricht | Program started successfully. |
%(name)s | Logger-Name | my_logger |
%(filename)s | Dateiname, in dem das Log erzeugt wurde | app.py |
%(lineno)d | Zeilennummer, an der das Log erzeugt wurde | 42 |
%(funcName)s | Funktionsname, in dem das Log erzeugt wurde | main |
6. Schnellkonfigurationsmethoden
| Methode | Beschreibung | Beispiel |
|---|---|---|
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 festfilename: Ausgabe in eine Dateifilemode: Dateimodus (wie z. B.'w'überschreiben)format: Formatzeichenfolgedatefmt: Datumsformat (wie z. B."%Y-%m-%d %H:%M:%S")
Beispiel
1. Grundlegende Konfiguration
Beispiel
# 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
# 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)