47 votes

Nommer les enregistreurs Python

Dans Django, j'ai des enregistreurs un peu partout, actuellement avec des noms codés en dur.

Pour la journalisation au niveau du module (c'est-à-dire dans un module de fonctions de vue), j'ai envie de faire cela.

log= logging.getLogger( __name__ )

Pour la journalisation au niveau de la classe (c'est-à-dire dans une classe __init__ méthode) J'ai l'envie de faire ça.

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

Je cherche une seconde opinion avant de m'attaquer à plusieurs dizaines d'occurrences de getLogger( "hard.coded.name" ) .

Est-ce que ça va marcher ? Quelqu'un d'autre nomme ses bûcherons de la même façon peu imaginative ?

De plus, dois-je décomposer et écrire un décorateur de classe pour cette définition de journal ?

67voto

cdleary Points 18869

En général, je n'utilise pas ou ne trouve pas le besoin de loggers au niveau de la classe, mais je garde mes modules à quelques classes tout au plus. Un simple :

import logging
LOG = logging.getLogger(__name__)

En haut du module et ensuite :

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

de n'importe où dans le fichier me permet généralement d'arriver là où je veux être. Cela évite d'avoir à self.log partout, ce qui a tendance à m'ennuyer tant du point de vue de la mise en place de toutes les classes que du fait que je suis à 5 personnages près de 79 lignes de caractères qui correspondent.

Vous pouvez toujours utiliser un pseudo-décorateur de classe :

>>> 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 journalisation au niveau de la classe, comme alternative à un décorateur de pseudo-classe, vous pourriez utiliser une métaclasse pour créer le logger pour vous au moment de la création de la classe...

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

On dirait que ça va marcher, sauf que self n'aura pas de __module__ son attribut de classe le fera. L'appel au logger au niveau de la 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:

X