我正在尝试将我的日志分成两个文件。我有主日志(根)和一个名为“auxlog”的子日志。我已经指定 auxlog 记录到它自己的文件中,它成功了,但它也出现在根日志中。我不知道我是否误解了 logging 模块的基本原理,或者我只是错过了一个配置选项。基本上,我想将我的日志分为以下两类:
- 一个日志来处理我的应用程序的整体功能,以及
- 另一个处理一个特定类的 logging 的日志。
这两个都有效,但特定类的日志是多余的,因为它被写入两个文件。这是我的代码:
logging.basicConfig(filename='app.log', level=logging.INFO, format='[%(asctime)s][%(name)s][%(levelname)s]: %(message)s')
# Aux Logger
auxlog = logging.getLogger("auxlog")
aux_handler = logging.FileHandler("aux.log")
aux_handler.setFormatter(logging.Formatter("[%(asctime)s]:[%(name)s]\t%(message)s"))
auxlog.setLevel(logging.INFO)
auxlog.addHandler(aux_handler)
当我在我的特殊类中使用 auxlog 时,我只是调用 auxlog.info("my message here")
,但是它仍然出现在 app.log
回答1
TL;DR:您可以通过设置 auxlog.propagate = False
来实现您想要的行为。
Python 记录器通过基于记录器名称(在 '.'
上拆分)形成树来工作。顾名思义,根记录器构成了这棵树的根。例如,名为 a.b
的记录器将是 a
的子级,而 a
将是根记录器的子级。
默认情况下,所有日志都会传播到它们的父记录器。重要的是,处理程序不会阻止这种传播行为 - 即它们的行为就像“三通”,而不是“接收器”。如果您希望它们被隔离,您必须明确关闭特定记录器上的传播。