在python中创建模块范围的记录器是否很好?

c08*_*089 5 python import logging coding-style

在编写python时,我经常使用日志记录模块.

一些不好的经验,并像阅读文章后这一个,我试图阻止进口时执行的代码尽可能.

但是,为了简单起见,我倾向于将我的日志记录对象放在模块文件的开头:

# -*- coding: utf-8 -*-
import logging
logger = logging.getLogger('product.plugin.foo.bar')
Run Code Online (Sandbox Code Playgroud)

这样,我的记录器可以全局访问,我可以在任何地方写"logger.error()".另一种方法是在类范围内创建它:

class Bar(object):
    logger = logging.getLogger('product.plugin.foo.bar')
Run Code Online (Sandbox Code Playgroud)

但是,现在我必须每次都输入类名.为了防止输入类名,我很想使用"self"代替静态方法.

    def my_method(self):
        Bar.logger.error('foo')

    def my_method_2(self):
        self.logger.error('foo') # ok...

    @staticmethod
    def my_method_2():
        self.logger.error('foo') # boom!
Run Code Online (Sandbox Code Playgroud)

所以,起初看起来像在模块范围内创建记录器对象似乎是正确的事情 - 仍然感觉就像我这样做时最终会导致与导入相关的麻烦......

Mat*_*ner 7

没关系.我甚至使用相同的变量名称logger.任何日志记录都比没有日志记录更好,但我发现展示记录器变量,保持模块隐藏,以便您的代码仅引用记录器,从而引用您为模块指定的名称空间,这是一种很好的做法.

如果以后需要优化模块中代码的命名空间,可以self.logger在这些类中使用,或者在必要时隐藏全局记录器.

Update0

__all__ = [anything but logger]
import logging
logger = logging.getLogger("why.is.this.method.still.java.camel.case")
del logging
Run Code Online (Sandbox Code Playgroud)

注意到S.Lott的贡献如下.另请注意,通常你不想要from x import *.