log python django logging

log - Nombrar registradores de Python



logging in django project (3)

Normalmente no uso ni encuentro la necesidad de registradores de nivel de clase, pero mantengo mis módulos en algunas clases como máximo. Un simple:

import logging LOG = logging.getLogger(__name__)

En la parte superior del módulo y posterior:

LOG.info(''Spam and eggs are tasty!'')

desde cualquier parte del archivo normalmente me lleva a donde quiero estar. Esto evita la necesidad de self.log todo el lugar, lo que tiende a molestarme desde una perspectiva de ponerlo en todas las clases y me hace 5 caracteres más cerca de 79 líneas de caracteres que se ajustan.

Siempre puedes usar un pseudo-clase-decorador:

>>> import logging >>> class Foo(object): ... def __init__(self): ... self.log.info(''Meh'') ... >>> def logged_class(cls): ... cls.log = logging.getLogger(''{0}.{1}''.format(__name__, cls.__name__)) ... >>> logged_class(Foo) >>> logging.basicConfig(level=logging.DEBUG) >>> f = Foo() INFO:__main__.Foo:Meh

En Django, tengo madereros por todos lados, actualmente con nombres codificados.

Para el registro a nivel de módulo (es decir, en un módulo de funciones de visualización) tengo ganas de hacerlo.

log = logging.getLogger(__name__)

Para el registro a nivel de clase (es decir, en un método de clase __init__ ), tengo ganas de hacerlo.

self.log = logging.getLogger("%s.%s" % ( self.__module__, self.__class__.__name__))

Estoy buscando una segunda opinión antes de abordar varias docenas de apariciones de getLogger("hard.coded.name") .

esto funcionara? ¿Alguien más nombra a sus registradores con las mismas formas sin imaginación?

Además, ¿debería analizar y escribir un decorador de clase para esta definición de registro?


Para el registro de nivel de clase, como alternativa a un decorador de pseudoclases, podría usar una metaclase para hacer el registrador para usted en el momento de creación de la clase ...

import logging class Foo(object): class __metaclass__(type): def __init__(cls, name, bases, attrs): type.__init__(name, bases, attrs) cls.log = logging.getLogger(''%s.%s'' % (attrs[''__module__''], name)) def __init__(self): self.log.info(''here I am, a %s!'' % type(self).__name__) if __name__ == ''__main__'': logging.basicConfig(level=logging.DEBUG) foo = Foo()


Parece que funcionará, excepto que el self no tendrá un atributo __module__ ; su clase lo hará. La llamada del registrador de nivel de clase debería verse así:

self.log = logging.getLogger( "%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) )