405 Stimmen

Die Verwendung von Protokollierung in mehreren Modulen

Ich habe ein kleines Python-Projekt mit folgender Struktur -

Projekt 
 -- pkg01
   -- test01.py
 -- pkg02
   -- test02.py
 -- logging.conf

Ich plane, das Standard-Logging-Modul zu verwenden, um Nachrichten sowohl auf stdout als auch in eine Protokolldatei zu drucken. Um das Logging-Modul zu verwenden, ist eine Initialisierung erforderlich -

import logging.config

logging.config.fileConfig('logging.conf')
logger = logging.getLogger('pyApp')

logger.info('testing')

Derzeit führe ich diese Initialisierung in jedem Modul durch, bevor ich Log-Nachrichten protokolliere. Ist es möglich, diese Initialisierung nur einmal an einem Ort durchzuführen, so dass die gleichen Einstellungen im gesamten Projekt wiederverwendet werden?

1voto

npjohns Punkte 2158

Neu bei Python, deshalb weiß ich nicht, ob das ratsam ist, aber es funktioniert großartig, um Boilerplate nicht neu schreiben zu müssen.

Ihr Projekt muss eine __init__.py haben, damit es als Modul geladen werden kann.

# Setzen Sie dies in die __init__.py Ihrer Module
import logging.config
import sys

# Ich habe dieses Dictionary-Beispiel verwendet, Sie würden einfügen:
# logging.config.fileConfig('logging.conf')
# Der Eintrag "" in loggers ist der Stamm-Logger, Tutorials verwenden immer "root", aber ich kann das nicht zum Laufen bringen
logging.config.dictConfig({
    "version": 1,
    "formatters": {
        "default": {
            "format": "%(asctime)s %(levelname)s %(name)s %(message)s"
        },
    },
    "handlers": {
        "console": {
            "level": 'DEBUG',
            "class": "logging.StreamHandler",
            "stream": "ext://sys.stdout"
        }
    },
    "loggers": {
        "": {
            "level": "DEBUG",
            "handlers": ["console"]
        }
    }
})

def logger():
    # Den Namen aus dem Aufrufer dieser Funktion erhalten
    return logging.getLogger(sys._getframe(1).f_globals['__name__'])

sys._getframe(1) Vorschlag stammt von hier

Dann können Sie Ihren Logger in jeder anderen Datei verwenden:

from [Ihrem Modulnamen hier] import logger

logger().debug("FOOOOOOOOO!!!")

Einschränkungen:

  1. Sie müssen Ihre Dateien als Module ausführen, sonst funktioniert import [Ihr Modul] nicht:
    • python -m [Ihr Modulname].[Ihr Dateiname ohne .py]
  2. Der Name des Loggers für den Einstiegspunkt Ihres Programms wird __main__ sein, aber jeder Lösung mit __name__ wird dieses Problem haben.

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