Professionelles Logging int mittelgroßen Projekten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Schlaengelchen
User
Beiträge: 2
Registriert: Dienstag 5. Januar 2021, 11:11

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Antworten