Naming Python loggers

后端 未结 3 558
深忆病人
深忆病人 2020-11-30 20:20

In Django, I\'ve got loggers all over the place, currently with hard-coded names.

For module-level logging (i.e., in a module of view functions) I have the urge to d

相关标签:
3条回答
  • 2020-11-30 20:30

    For class level logging, as an alternative to a pseudo-class decorator, you could use a metaclass to make the logger for you at class creation time...

    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()
    
    0 讨论(0)
  • 2020-11-30 20:35

    That looks like it will work, except that self won't have a __module__ attribute; its class will. The class-level logger call should look like:

    self.log = logging.getLogger( "%s.%s" % ( self.__class__.__module__, self.__class__.__name__ ) )
    
    0 讨论(0)
  • 2020-11-30 20:47

    I typically don't use or find a need for class-level loggers, but I keep my modules at a few classes at most. A simple:

    import logging
    LOG = logging.getLogger(__name__)
    

    At the top of the module and subsequent:

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

    from anywhere in the file typically gets me to where I want to be. This avoids the need for self.log all over the place, which tends to bother me from both a put-it-in-every-class perspective and makes me 5 characters closer to 79 character lines that fit.

    You could always use a pseudo-class-decorator:

    >>> 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
    
    0 讨论(0)
提交回复
热议问题