Auf welche Weise wissen Sie, wo Python-Protokollanweisungen gespeichert werden?
wenn ich es tue:
import logging
log = logging.getLogger(__name__)
log.info('Test')
Wo finde ich die Logdatei? Auch wenn ich anrufe:
logging.getLogger(__name__)
Hat das irgendwie etwas damit zu tun, wie sich der Logger verhält/speichert?
Das logging
-Modul verwendet Handler, die mit Loggern verbunden sind, um zu entscheiden, wie, wo oder sogar, ob Nachrichten letztendlich gespeichert oder angezeigt werden. Sie können logging
standardmäßig so konfigurieren, dass auch in eine Datei geschrieben wird. Sie sollten wirklich die Datei docs lesen, aber wenn Sie logging.basicConfig(filename=log_file_name)
aufrufen, wobei log_file_name
der Name der Datei ist, in die Nachrichten geschrieben werden sollen (beachten Sie, dass Sie dies tun müssen, bevor etwas anderes in logging
aufgerufen wird), dann alle Meldungen, die an alle Logger protokolliert werden (sofern nicht später eine weitere Neukonfiguration erfolgt), werden dort geschrieben. Beachten Sie jedoch, auf welcher Ebene der Logger eingestellt ist. Wenn der Speicher dient, liegt info
unter der Standardprotokollebene. Sie müssen also level=logging.INFO
in die Argumente von basicConfig
einschließen, damit Ihre Nachricht in der Datei endet.
Was den anderen Teil Ihrer Frage betrifft, gibt logging.getLogger(some_string)
ein Logger
-Objekt zurück, das vom Root-Logger an der richtigen Stelle in der Hierarchie eingefügt wird, wobei der Name der Wert von some_string
ist. Wird ohne Argumente aufgerufen, gibt es den Root-Logger zurück. Da __name__
den Namen des aktuellen Moduls zurückgibt, gibt logging.getLogger(__name__)
ein Logger
-Objekt mit dem Namen des aktuellen Moduls zurück. Dies ist ein allgemeines Muster, das mit logging
verwendet wird, da es dazu führt, dass die Loggerstruktur die Modulstruktur Ihres Codes widerspiegelt. Dies macht Protokollnachrichten beim Debuggen oft nützlicher.
Versuchen Sie, den Protokollspeicherort eines einfachen Datei-Loggers abzurufen
logging.getLoggerClass().root.handlers[0].baseFilename
Um den Speicherort der Protokolldatei zu ermitteln, versuchen Sie, Ihr log
-Objekt in einer Python-Shell in Ihrer Umgebung zu instantiieren.
log.handlers[0].stream
Ausgezeichnete Frage @ Zallarak. Unglücklicherweise sind Loggers
schwer einsehbar. Dadurch werden die Dateinamen aller Handlers
für eine logger
abgerufen:
filenames = []
for handler in logger.handlers:
try:
filenames.append(handler.fh.name)
except:
pass
Der try
-Block behandelt Ausnahmen, die auftreten, wenn die Suche nach Dateinamen fehlschlägt.