"logging" für Anwenderinfos und Fehlermeldungen

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
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

Hallo Zusammen,

Ich habe in meine Anwendung ein globales Logging eingefügt. Die Logging-Nachrichten werden zum einen an einen "logging.Streamhandler" zum anderen an einen "logging.FileHandler" übergeben.
Der Streamhandler fügt die Loggings gefiltert in ein Text-Widget der GUI (Tkinter) ein. Diese dienen der Information des Users und sagen ihm was gerade im Detail berechnet/ersetzt/geändert wurde.
Der Filehandler schreibt alle (ungefiltert) Logging-Nachrichten in eine Logging-Datei im Userverzeichnis. (Sowohl die Infos an den User als auch Debug- oder Fehlermeldungen) Dies soll mir dabei helfen auftretende Probleme besser nachvollziehen zu können, um die Anwendung später zu optimieren.
Der Logger steht momentan auf Modulebene im Controller:

Code: Alles auswählen

import logging
import os

application_logger = logging.getLogger('statuslogger')
application_logger.setLevel(logging.DEBUG)

log_formatter = logging.Formatter(fmt='%(asctime)s [%(levelname)-7s] in %(module)s.%(funcName)s@line:%(lineno)d --> %(message)s',
                                  datefmt='%Y-%m-%d %H:%M:%S')

console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(log_formatter)

home_dir = os.path.expanduser('~')
app_folder = os.path.join(home_dir, 'Prepro')
try:
    os.mkdir(app_folder)
except FileExistsError:
    print('folder already exists') # edit exception handling later
filename = os.path.join(app_folder, 'prepro.log')

file_handler = logging.FileHandler(filename)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(log_formatter)

application_logger.addHandler(console_handler)
application_logger.addHandler(file_handler)
und in jedem Modul, in dem ich das logging benötige wird wiederum auf Modulebene eine Referenz zum logger definiert.
(z.b. im View)

Code: Alles auswählen

application_logger = logging.getLogger('statuslogger')
# ...
Könnte man hier grundsätzlich was verbessern bzw. spricht was gegen diese Art der Verwendung eines loggers?
Was mir persönlich noch nicht gefällt, ist der umfangreiche Code auf Modulebene in der controller.py.

Gruß Seb
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kniffte: zum Konfigurieren des Loggers braucht man halt einiges an Code. Alternativ könntest Du auch eine ini-Datei verwenden.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@Sirius3:
Ok...eine ini-Datei wäre eine Möglichkeit, aber im Prinzip würde ich so auch nur Teile des Programms verschieben/ auslagern.
Grundsätzlich würde mir die Verwendung einer .ini-Datei zur Konfiguration des Loggers oder das Umschreiben der Loggerkonfiguration als Funktion (oder Klasse) erstmal keine Vor- oder Nachteile bringen?
Ich habe halt im Hinterkopf, wie es hier gern betont wird, dass auf Modulebene möglichst nur Konstanten, Importe, Funktionen & Klassen was zu suchen haben und ich hier in meinem Codebsp. diesbzgl. was ändern sollte?
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kniffte: ach darum geht's. Die Konfiguration des Loggers solltest Du in eine Funktion schreiben und irgendwann am Anfang des Hauptprogramms aufrufen.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@Sirius3:
:) Danke...hatte ich fast schon vermutet.
Antworten