设置类级别记录器

Ore*_*lom 2 python logging

我可以轻松配置全局记录器的属性:

logging.basicConfig(
    level=logging.INFO,
    format="[%(asctime)s] [%(levelname)s]: %(message)s",
    datefmt="%d/%m/%Y ( %H:%M:%S )",
    stream=sys.stdout
)
Run Code Online (Sandbox Code Playgroud)

如何在班级层面实现同等的目标?(下面的代码不起作用

import logging
class SomeClass:
    def __init__(self) -> None:
        self.logger = logging.getLogger(__name__)
        self.logger.dictConfig({
            "level": logging.INFO,
            "format": "[%(asctime)s] [%(levelname)s]: %(message)s",
            "datefmt": "%d/%m/%Y ( %H:%M:%S )",
            "stream": sys.stdout
        })
    def foo(self) -> None:
        self.logger.info("foooo ...")

c = SomeClass()
c.foo()
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

$ python logger.py 2>&1 | grep "Error"
AttributeError: 'Logger' object has no attribute 'dictConfig'
Run Code Online (Sandbox Code Playgroud)

编辑:我寻找单个初始化命令,而不是类似:

self.logger.setLevel(...)
self.logger.setFormatter(...)
Run Code Online (Sandbox Code Playgroud)

Vin*_*jip 5

您可能不喜欢这个答案,但在 Python 中,类级记录器并没有真正意义 - 与 Java 和 C# 不同,其中类是软件分解的单元,而在 Python 中,模块就是该单元。因此,给出模块__name__的名称,而不是其中定义的任何特定类。

此外,日志记录配置(关于处理程序、格式化程序、过滤器等)是在应用程序级别而不是库级别完成的,因此在这种情况下应该只执行一次__name__ == '__main__',而不是在随机类中执行一次。

如果您确实需要比模块级别更精细的日志记录,请使用记录器名称,例如__name__ + '.SomeClass'您的记录器。

日志记录文档列出了许多与最佳实践相反的反模式。

  • @Booboo 根据我的经验,人们通常需要类级记录器,因为这是他们在 Java、C# 环境中所习惯的,而不是因为功能原因实际上需要它。因此我提出了对立点。 (2认同)