代码之家  ›  专栏  ›  技术社区  ›  S.Lott

命名Python记录器

  •  46
  • S.Lott  · 技术社区  · 17 年前

    对于模块级日志记录(即,在视图功能模块中),我迫切需要这样做。

    log = logging.getLogger(__name__)
    

    用于类级日志记录(即,在类中 __init__ 方法)我有这样做的冲动。

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

    在处理几十起类似事件之前,我正在寻找第二种意见 getLogger("hard.coded.name") .

    这样行吗?还有人用同样缺乏想象力的方式给伐木工人命名吗?

    此外,我是否应该分解并为此日志定义编写一个类装饰器?

    3 回复  |  直到 10 年前
        1
  •  68
  •   cdleary    17 年前

    我通常不使用或发现需要类级记录器,但我将模块最多保留在几个类中。一个简单的例子:

    import logging
    LOG = logging.getLogger(__name__)
    

    在模块顶部和后续部分:

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

    通常,从文件中的任何位置都可以让我到达我想要去的地方。这就避免了 self.log 到处都是,这往往会从两个方面困扰我,把它放在每个类的角度,使我5个字符接近79个字符行适合。

    >>> 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
    
        2
  •  3
  •   Matt Anderson    16 年前

    对于类级日志记录,作为伪类装饰器的替代,您可以使用元类在类创建时为您创建日志记录器。。。

    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()
    
        3
  •  2
  •   Steve Losh    17 年前

    看起来它会起作用的,除了 self __module__ 属性它的班级会。类级记录器调用应如下所示:

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