我可以轻松配置全局记录器的属性:
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)
您可能不喜欢这个答案,但在 Python 中,类级记录器并没有真正意义 - 与 Java 和 C# 不同,其中类是软件分解的单元,而在 Python 中,模块就是该单元。因此,给出模块__name__
的名称,而不是其中定义的任何特定类。
此外,日志记录配置(关于处理程序、格式化程序、过滤器等)是在应用程序级别而不是库级别完成的,因此在这种情况下应该只执行一次__name__ == '__main__'
,而不是在随机类中执行一次。
如果您确实需要比模块级别更精细的日志记录,请使用记录器名称,例如__name__ + '.SomeClass'
您的记录器。
日志记录文档列出了许多与最佳实践相反的反模式。
归档时间: |
|
查看次数: |
2302 次 |
最近记录: |