为什么在每个新模块中都有一个新的记录器对象?

时间:2016-09-22 15:29:50

标签: python multithreading performance logging instrumentation

python日志记录模块有一个共同模式(ex1ex2),在每个模块中,每个python模块都会获得一个新的记录器对象。

我不是盲目追随模式的粉丝,所以我想多了解一点。

为什么在每个新模块中都有一个新的记录器对象?

为什么不让每个人都使用相同的根记录器并使用%(module)s配置格式化程序?

是否存在这种模式是必需/需要的例子(即由于某种性能原因[1])?

[1] 在多线程python程序中,是否存在某些隐藏的同步问题,这些问题通过使用多个日志记录对象来修复?

2 个答案:

答案 0 :(得分:1)

每个记录器都可以单独配置。通常,模块本身未配置模块记录器 。您可以创建一个独特的记录器并使用它来记录不同详细程度的消息。 使用记录器的人决定要查看的消息级别,发送消息的位置,甚至如何显示消息。他们可能希望从一个模块记录到文件中的所有内容(DEBUG和更多),而另一个模块,他们可能只关心是否发生严重错误(在这种情况下,他们希望通过电子邮件直接发送给他们)。如果每个模块都使用相同的(根)记录器,那么就没有这种灵活性。

答案 1 :(得分:1)

记录器名称定义在应用程序事件中(逻辑上)。因此,推荐的模式

logger = logging.getLogger(__name__)

使用跟踪Python包层次结构的记录器名称。这反过来允许配置日志记录的任何人为特定记录器上调或下调详细程度。如果所有东西都只使用了根记录器,那么就无法对详细程度进行精细控制,这在系统达到一定的大小/复杂度时非常重要。

记录器名称不需要精确跟踪包名称 - 例如,您可以在某些包中使用多个记录器。主要决定因素是需要多大的灵活性(如果您正在编写应用程序),也可能需要您的用户需要多大的灵活性(如果您正在编写库)。