Logging
Verfasst: Donnerstag 8. Dezember 2011, 11:19
Hallo,
ich würde gerne für ein Package logging implementieren. Was eigentlich trivial erscheint stellt mich doch vor einige Probleme. Denn wie erstellt man am besten ein flexibles, optionales Loggingsystem für ein Package? Irgendwo muss ja definiert werden, wohin geloggt werden soll, und ob überhaupt. Hat dann jede Klasse ein log-Attribut, jede Funktion einen log-Parameter, der bestimmt, ob geloggt werden soll? Und schreibt man dann an jeder interessanten Stelle (für eine Klasse z.B.):
oder geht man das anders an? Ich habe mir schon zu diesem Zweck mal Flask und SQLAlchemy angesehen, aber diese Projekte sind mir schon wieder zu gross um zu erkennen, wie das da intern gehandhabt wird. Zumindest bei SQLAlchemy meine ich an einigen Stellen (Z. 1199) solche Abfragen gesehen zu haben.
Und wie definiert man am besten eine Ausgabequelle für das Logging? Das will man ja eigentlich nur einmal machen müssen. Im __init__.py eine Modulvariable setzen, die dann vom logging ausgewertet wird? Ist das für einen Nutzer eine zumutbare Konfigurationsmöglichkeit?
Was muss man beachten, damit man das logging von anderen Paketen, die evt. benutzt werden, nicht kaputt macht? Ich habe diesbezüglich eine Warnung bei SQLAlchemy gelesen. Im CookBook steht ja auch, dass der Logger ja immer derselbe innerhalb eines Prozesses ist.
Mir ist klar, dass es da kein allgemeingültiges Rezept gibt, aber zumindest einige Ansätze muss es doch geben. Ich glaube, mein größtes Problem ist die Package-weite Konfiguration der Ausgabequelle - da habe ich irgendwie überhaupt keinen Ansatz zu.
ich würde gerne für ein Package logging implementieren. Was eigentlich trivial erscheint stellt mich doch vor einige Probleme. Denn wie erstellt man am besten ein flexibles, optionales Loggingsystem für ein Package? Irgendwo muss ja definiert werden, wohin geloggt werden soll, und ob überhaupt. Hat dann jede Klasse ein log-Attribut, jede Funktion einen log-Parameter, der bestimmt, ob geloggt werden soll? Und schreibt man dann an jeder interessanten Stelle (für eine Klasse z.B.):
Code: Alles auswählen
if self.log:
logger.info('Foobar')
Und wie definiert man am besten eine Ausgabequelle für das Logging? Das will man ja eigentlich nur einmal machen müssen. Im __init__.py eine Modulvariable setzen, die dann vom logging ausgewertet wird? Ist das für einen Nutzer eine zumutbare Konfigurationsmöglichkeit?
Code: Alles auswählen
# __init__.py
import sys
log_out = None
Code: Alles auswählen
# Nutzerskript
import package
package.log_out = '/foo/bar'
Solange man seine Packages im Homedir hat, kann man ja einfach loggen, doch sobald man eine systemweite Installation des Packages vorsehen will, muss man doch mehr aufpassen, als ich anfangs gedacht habe. Allein das der logger prozessweit immer derselbe ist, hat mich schon verwirrt, ist das doch erst einmal konträr zu meinen Erfahrungen mit Pythons Modulsystem.Multiple calls to logging.getLogger('someLogger') return a reference to the same logger object. This is true not only within the same module, but also across modules as long as it is in the same Python interpreter process.
Mir ist klar, dass es da kein allgemeingültiges Rezept gibt, aber zumindest einige Ansätze muss es doch geben. Ich glaube, mein größtes Problem ist die Package-weite Konfiguration der Ausgabequelle - da habe ich irgendwie überhaupt keinen Ansatz zu.