python - 在 python 中创建模块范围的记录器是好的设计吗?

标签 python logging coding-style import

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

在经历了一些糟糕的经历并阅读了类似 this one 的文章之后, 我尽量避免导入时执行代码。

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

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

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

class Bar(object):
    logger = logging.getLogger('product.plugin.foo.bar')

但是,现在我每次都必须输入类名。为了避免键入类名,我很想改用“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!

所以,起初,看起来在模块范围内创建记录器对象似乎是正确的做法 - 仍然感觉我这样做时可能会遇到与导入相关的麻烦...

最佳答案

没关系。我什至使用相同的变量名 logger。任何日志记录都比没有日志记录好,但我发现公开记录器变量是一种很好的做法,将模块隐藏起来,这样您的代码只引用记录器,因此您指定的命名空间模块。

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

更新0

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

注意到 S.Lott 在下面的贡献。另请注意,通常您不希望 from x import *

关于python - 在 python 中创建模块范围的记录器是好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3502558/

相关文章:

Python-按名称从列表中删除元素的函数

python - Pandas groupby 在使用两次应用时复制组

php - 为什么从 PHP 5.4 开始永久启用 "echo"短标签?

python 3 如何在上一个输入行上打印

python - 带有 GDB : the case of nlohmann json library 的 C++ 调试/打印自定义类型

debugging - 当我在 Gradle 中运行单个测试时,如何获得详细的日志记录?

python - 如何格式化 python 记录器的默认消息

mysql: 恰好语句 "Start binlog_dump to slave_server"登录到master错误日志

java - 在团队中任意使用代码格式化程序模板是否有意义?

ruby - 为什么行数太多的方法是一件坏事?