hier im Forum haben mich einige Programmierer darauf hingewiesen, dass man auf Print-Anweisungen verzichten, und sich dem Logging-Modul widmen solle. Der Hinweis ist berechtigt. Nun beschäftige ich mich mit dem Thema, aber kam gleich zu Beginn auf eine Frage. Wie protokolliere ich bestimmte Information von mehreren Modulen aus? Ein jedes Projekt kommt nicht drumherum mehrere eigene Module anzulegen, wenn man seine Funktionen und Klassen auslagern will/muss, damit dies auch übersichtlich bleibt. Nun möchte ich dies nicht nur protokollieren, sondern diese Ereignisse auch in eine Datei hinterlegen. Zum Beispiel, wenn ein Anwender Probleme mit meiner Software hat, kann ich ja die Log-Datei einsehen und feststellen, wo das Problem liegt bzw. unter welchen Bedingungen oder unter welchem Verhalten dieses Problem auftrat.
Dazu habe ich mir ein (ungetestetes) Beispiel überlegt, und hätte gern gewusst, ob dies ein falscher Ansatz sei?
Zunächst dachte ich mir, ich lege ein zentrales Python-Modul an, namens my_logger.py. Dort ist eine Central_Logger()-Klasse, die vom "object" abgeleitet wird. Hier wird logging configuriert. Zum Beispiel in welche Datei geschrieben werden soll, und welche Level verwendet werden sollen. Dann habe ich ein weiteres unabhängiges Modul namens example_module.py Dort wird beispielsweise eine Funktion definiert, die bestimmte Probleme bewerkstelligen soll. Beim Aufruf dieser Funktion soll etwas gemacht werden, und dabei wird protokolliert. Und diese Protokolle gehen dann zurück zur Central_Logger()-Klasse, und wird dann in die Log-Datei geschrieben. Damit ich mich nicht um das Schließen der Datei kümmern muss, bediene ich mich hier der With-Anweisung. Das war meine Idee. Mir geht es also darum, zu überlegen, wie ich bei mehreren Modulen das Logging anwenden kann, und diese Informationen in eine Datei schreiben kann, ohne dass diese Datei von unterschiedlichen Module aus jedesmal erneut geöffnet wird. Wenn man am Ende - sagen wir mal - 100 Module hat, dann wird es mit dem Öffnen und Schreiben der Log-Datei sehr unübersichtlich und dazu auch unkontrolliert.
my_logger.py
Code: Alles auswählen
import logging
class Central_Logger(object):
def __init__(self):
LOG_FILENAME = 'PATH/TO/YOUR/LOGFILE.txt'
logging.basicConfig(filename=LOG_FILENAME,
level=logging.DEBUG,
level=logging.WARNING,
level=logging.INFO,
level=logging.ERROR,
level=logging.CRITICAL
)
self.logr = logging.getLogger('root')
with open(LOG_FILENAME, 'a') as log_file:
data = log_file.write(self.logr)
# do something with data
Code: Alles auswählen
from my_logger import Central_Logger
def do_somethink(a, b):
Central_Logger.logr.info("The function (do_somethink is called")
Central_Logger.logr.info("The calculation starts")
result = a*b
Central_Logger.logr.info("The calculation is complete. The result is %s") & result
Central_Logger.logr.info("Return the result of the calculation") & result
return result