关于python log追加问题的小记

167 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。项目框架调用了python的logging库来记录生成日志,之前图省事,只生成了一个日志文件,后续随着模块的增加,一个日志文件 就变的越来越庞大,然后为了解决这个问题,根据模块来区分,每个模块生成自己独立的日志文件,然后神奇的事情发生了,后续模块的日志还会继续追加到第一个日志模块文件中,通过定位分析,发现是logging库有一个属性propagate在作怪。

propagate属性

官方文档docs.python.org/zh-cn/3/lib… 描述,如果这个属性为真,记录到这个记录器的事件除了会发送到此记录器的所有处理程序外,还会传递给更高级别(祖先)记录器的处理器,此外任何关联到这个记录器的处理器。

消息会直接传递给祖先记录器的处理器(不考虑祖先记录器的级别和过滤器) 这个属性默认初始化是真

还有一个注解如下

如果你将一个处理器附加到一个记录器和其一个或多个祖先记录器,它可能发出多次相同的记录。通常,您不需要将一个处理器附加到一个以上的记录器上 —— 如果您将它附加到记录器层次结构中最高的适当记录器上,则它将看到所有后代记录器记录的所有事件,前提是它们的传播设置保留为 True。一种常见的方案是仅将处理器附加到根记录器,通过传播来处理其余部分。

为了理解上述内容,我们先要了解什么是记录器,处理器 logging库提供了几类组件,有记录器,处理器,过滤器和格式器 初始化一个记录器

import logging logger =

import logging
logger = logging.getLogger(filename)

[getLogger()]返回对具有指定名称的记录器实例的引用(如果已提供),或者如果没有则返回 root 。名称是以句点分隔的层次结构。多次调用 [getLogger()]具有相同的名称将返回对同一记录器对象的引用。在分层列表中较低的记录器是列表中较高的记录器的子项。例如,给定一个名为 foo 的记录器,名称为 foo.bar 、 foo.bar.baz 和 foo.bam 的记录器都是 foo 子项。

处理器---[Handler]对象负责将适当的日志消息(基于日志消息的严重性)分派给处理器的指定目标。 [Logger] 对象可以使用 [addHandler()] 方法向自己添加零个或多个处理器对象

后续把祖先记录器logger的propagate属性设置为false,问题解决

logger.propagate = 0