如何使用Python日志记录器类(logging setLoggerClass)?

4

我希望在我正在开发的Python应用程序中添加一个自定义日志记录器。我认为Python的logging模块打算支持这种定制,但是我不知道它如何与typical way of using the logging module一起使用。通常情况下,你会在一个模块中创建一个logger对象,例如:

import logging
logger = logging.getLogger(__name__)

然而,在应用程序中的某个地方,可能是入口点,我将不得不告诉日志记录模块使用我的记录器类。

logging.setLoggerClass(MyLogger)

然而,这通常会在模块已经被导入并且日志记录器对象已经分配的情况下调用。我可以想到几种解决这个问题的方法(使用管理器类来注册日志记录器分配或为每个日志记录调用getLogger() -- yuk),但这不感觉正确,我想知道正确的做法是什么。

1个回答

2
任何日志初始化/设置/定制都应该在应用程序代码运行之前完成。您可以通过将其放置在主应用程序目录的__init__.py文件中来实现这一点(这意味着它将在导入/读取任何模块之前运行)。
您也可以将其放置在settings.py模块中,并将该模块作为应用程序中的第一件事导入。只要日志设置代码在getLogger调用之前运行,那么就没问题了。

啊。通常情况下,我没有真正使用__init__文件进行初始化,只是为了包结构和导入方便的函数。显然,它是正确的初始化代码位置 :) 然而,我想添加到记录器的日志处理程序之一是文件处理程序,因此具有用户可以从命令行指定的日志路径。我想我可以将其作为可以传递实例更改的类变量添加,但我认为这不是一个很好的方法,因为它会创建一个竞争条件。 - jdowner
经过一番尝试,我想我明白了。之前,我将处理程序安装作为日志记录器初始化的一部分,我认为这样做是错误的。我已经将处理程序的添加移动到入口点代码中,这样可以避免文件处理程序的竞争条件,并确保使用logging.getLogger()的模块获得我想要的定制类。感谢你的帮助! - jdowner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接