Seite 1 von 1

Professionelles Logging int mittelgroßen Projekten

Verfasst: Freitag 5. März 2021, 16:22
von Schlaengelchen
Hi,

ich habe ein Projekt mit ~30.000 Zeilen Python Code und bin mit meinem bisherigen Logging Ansatz sehr unzufrieden.
Daher würde mich sehr interessieren, wie es professioneller geht.
Beim Startpunkt meiner Skriptes ist folgender Code:

Code: Alles auswählen

import logging
logger = logging.getLogger(__name__) 
logging.basicConfig()
Ein paar Libraries, die ich mit weiteren Projekten teile, haben folgenden Code:

Code: Alles auswählen

import logging
logger = logging.getLogger(__name__)
Einige Skripte in meinen Projekt führen Testreihen aus, und sollen pro Skript in ein eigenes Logfile schreiben.
Daher habe ich mir in meiner Main eine Funktion, die den Modulen explizite Logger eingeschreibt:

Code: Alles auswählen

def getPretteLogger(Loglevel, ....):
	newLogger = ...
	# apply handlers etc
	return newLogger
	
def registerLogger():
	skript1Logger = getPrettyLogger(..)
	skript1.registerLogger(skript1Logger)

Die Skripte haben jeweils eine Interface Funktion, um die registrierung der Logger zu ermöglichen:

Code: Alles auswählen

logger = logging.getLogger(__name__)

def registerLogger(skript1Logger):
	global logger
	logger = skript1Logger
In Zukunft hatte ich zudem geplant, pro modul ein .yml config File zu erstellen und dieses zu laden. Das würde das etwas unschöne
registrieren verhindern.
Wenn ich den Code so ansehe wirkt er für mich wie lieblos dahin gehackt, gibt es hier einen anderen best practice Ansatz
den ich noch nicht kenne?
Ich würde gerne verhindern, dass es eine Eltern Kind beziehung zwischen meinem Einstiegsmodul und den Skripten gibt.
Es wäre zb schön, wenn ich den globalen Logger umschreiben könnte und die einzelnen Skripte beim holen des loggers
automatisch den richtigen Pfad, Loglevel etc bekommen.

Re: Professionelles Logging int mittelgroßen Projekten

Verfasst: Montag 8. März 2021, 13:26
von DasIch
Wir haben einfach ein `logger = logging.getLogger(__name__)` (bzw. das structlog equivalent, man möchte die Logs ja sinnvoll durchsuchen können) in jedem Modul. Konfiguriert wird (nur bei Anwendungen natürlich) einmal global. Außer dem root logger bekommt kein Logger irgendwelche Handler oder sonstige Konfiguration (Ausnahme: 3rd party libraries die sehr gesprächig sind bekommen ggfs. ein höheres Log Level oder werden stummgeschaltet).

Was du vorhast bzw. anscheinend sowieso schon tust wär mir viel zu kompliziert. Wie soll jemand der deine Anwendung nutzt die ernsthaft konfiguriert kriegen, erst Recht mit einer Konfigurationsdatei pro Modul. Tu dir und deinen Anwendern einen gefallen und beschränk dich auf maximal eine Konfigurationsdatei für die gesamte Anwendung.

Zum Thema best practices: Deine Anwendung sollte keine Logdateien produzieren sondern nach stdout loggen. Man sollte sich auf jeden fall mit Structured Logging beschäftigen, gerade wenn man Logs zentral aggregieren und durchsuchen möchte kommt man da eigentlich nicht drumherum. PEP 8 sollte man sich auch mal anschauen, wenn man Python nutzt.