我有一个用python编写的简单命令行程序。程序使用通过以下方式配置的日志记录模块记录到屏幕:

logging.basicConfig(level=logging.INFO, format='%(levelname)-8s %(message)s')


奇怪的是,在我的笔记本电脑中,该程序以所需的格式记录了正确的级别(INFO),而当我在服务器上运行该程序时,该程序仅记录了另一种格式的错误和警告。

在这两个系统中,我都在虚拟环境中运行Python 2.7。环境并不完全相同。

我认为某些模块正在更改我的配置。我不明白为什么它仅在服务器上发生,但是有什么办法可以找到哪个?

提前致谢,

最佳答案

如果根记录器已经配置了处理程序,则记录中的basicConfig() API将不执行任何操作(如所记录)。您的basicConfig()调用可能会被忽略,因为服务器中的某些其他代码已经为根记录器配置了一些处理程序。

通常,库代码不应添加处理程序-这是应用程序开发人员的责任。但是如果你是在使用框架开发Web应用程序时,该框架可能已经配置了一些处理程序。

您说的是“在服务器上”,但不清楚是在谈论服务应用程序,还是在恰好是服务器的机器上运行实用程序脚本。如您所说,虚拟环境略有不同,因此它们之间的差异可能是寻找提示的地方。

要找出根记录器上正在配置的处理程序,可以对basicConfig()addHandler()的相关源进行grep复制。

另外,您可以显式添加一个处理程序,而不是依靠basicConfig()为您完成此操作:

f = logging.Formatter('%(levelname)-8s %(message)s')
h = logging.StreamHandler()
h.setFormatter(f)
logging.getLogger().addHandler(h)


但是,如果还将其他控制台处理程序也添加到根记录器中,则可能会导致出现多个消息。

10-08 05:44