46 votes

Nommage des enregistreurs Python

Dans Django, j'ai enregistreurs de tous sur la place, actuellement codé en dur noms.

Pour le module de niveau d'enregistrement (c'est à dire, dans un module de fonctions de vue), j'ai l'envie de le faire.

log= logging.getLogger( __name__ )

Pour la classe de niveau d'enregistrement (c'est à dire, dans une classe __init__ méthode) j'ai envie de le faire.

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

Je suis à la recherche d'un deuxième avis avant de m'attaquer à plusieurs dizaines d'occurrences de getLogger( "hard.coded.name" ).

Ce travail? Personne d'autre naming leurs enregistreurs avec la même imagination?

De plus, si je suis en panne et écrire une classe décorateur pour ce journal à la définition?

66voto

cdleary Points 18869

En général, je n'utilisez pas ou trouver un besoin pour la classe de niveau de bûcherons, mais je garde mes modules à quelques classes au plus. Un simple:

import logging
LOG = logging.getLogger(__name__)

En haut du module et ultérieure:

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

à partir de n'importe où dans le fichier obtient généralement moi à l'endroit où je veux être. Cela évite la nécessité d' self.log tous sur la place, ce qui tend à me dérange pas à partir à la fois d'une mise-elle-dans-tous-perspective de classe et me fait 5 caractères plus près de 79 lignes de caractères qui correspondent.

Vous pouvez toujours utiliser une pseudo-classe-décorateur:

>>> 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

3voto

Matt Anderson Points 7461

Pour la consignation au niveau de la classe, vous pouvez utiliser une métaclasse pour créer le consignateur au moment de la création de la classe, au lieu d'un décorateur de pseudo-classes.

 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()
 

2voto

Steve Losh Points 11958

Cela semble fonctionner, sauf que self n'aura pas d'attribut __module__ ; sa classe sera. L'appel de l'enregistreur de niveau classe devrait ressembler à ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: