Standardloggerklasse erweitern
Verfasst: Montag 22. Juli 2013, 22:24
Das nachfolgende Modul zeigt einen Versuch den logging.Logger zu erweitern. Beabsichtigt ist eine Ausgabe bei Klassen, die die Klassenhierarchie zeigt, nur leider wird meine Klasse MyLogger nicht benutzt!
Wie man sieht wird die Klassenhierarchie nicht angezeigt. Verschiedene Tests zeigten mir, dass die Klasse gar nicht benutzt wird.
Was läuft hier falsch?
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, inspect, logging
class MyLogger(logging.Logger):
"""Deute Klassenhierarchie durch ``A.B.C.method`` an.
"""
def __init__(self, name=""):
logging.Logger.__init__(self, name)
def debug(self, msg, *args, **kwargs):
method = inspect.stack()[1][3]
frm = inspect.stack()[1][0]
if 'self' in frm.f_locals:
clst = frm.f_locals['self'].__class__.mro()[:-1]
clst.reverse()
method = "%s.%s" % (".".join(x.__name__ for x in clst), method)
if not method.startswith('<'):
method += '()'
msg = ''.join((method, str(frm.f_lineno), msg))
self.__class__.__bases__[0].debug(self, msg, *args, **kwargs)
logging.setLoggerClass(MyLogger)
logging.basicConfig(
level=logging.DEBUG,
format="%(module)-18s:%(lineno)4d [%(funcName)-17s] %(message)s",
stream=sys.stdout,
)
Logger = logging.getLogger()
class A(object):
def __init__(self, a="<<A>>", *args, **kwargs):
if Logger.level == logging.DEBUG:
Logger.debug("Test A")
self.attr_a = a
def __unicode__(self):
return u"<A: A.attr_a=%s>" % (self.attr_a,)
class B(A):
def __init__(self, a="<<A>>", b="<<B>>", *args, **kwargs):
if Logger.level == logging.DEBUG:
Logger.debug("Test B")
A.__init__(self, a, *args, **kwargs)
self.attr_b = b
def __unicode__(self):
return u"<B: B.attr_a=%s, B.attr_b=%s>" % (self.attr_a, self.attr_b)
if __name__ == "__main__":
a = A()
b = B()
Was läuft hier falsch?