不同系统中的Python日志记录显示不同的格式/级别

时间:2011-05-06 08:58:02

标签: python logging

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

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

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

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

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

提前致谢,

3 个答案:

答案 0 :(得分:1)

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

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

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

要了解根记录器上配置处理程序的内容,您可以查看basicConfig()addHandler()的相关来源。

或者,您可以明确添加处理程序,而不是依靠basicConfig()为您执行此操作:

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

但如果其他控制台处理程序也添加到根记录器,则可能会导致多条消息。

答案 1 :(得分:0)

如果您认为它是某个模块,请尝试使用cx_freeze或Py2exe冻结代码。那将创建和执行文件,并将它所需的模块放入其中,因此它不依赖于系统上的模块。

答案 2 :(得分:0)

python日志系统配置在python进程中是唯一的。如果某人更改了进程中的日志记录配置,则此进程中生成的所有日志都将遵循此配置。