2011-05-06 48 views
1

我有一个用python编写的简单的命令行程序。程序日志筛选使用以下方式配置的记录模块:不同系统中的Python日志显示不同的格式/级别

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

奇怪的是,在我的笔记本电脑,在合适的水平程序日志(INFO)一个与所需的格式,而当我在服务器上运行该程序,该程序仅记录其他格式的错误和警告。

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

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

由于提前,

回答

1

伐木的basicConfig() API不会做任何事情(如记录),如果根logger已经配置的处理程序。您的basicConfig()调用可能会被忽略,因为服务器中的其他代码已经为根日志记录器配置了一些处理程序。

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

你说“在服务器上”,但目前还不清楚是否你在谈论的服务应用程序,或只是运行的恰好是一个服务器的计算机上的实用程序脚本。正如你所说,虚拟环境略有不同,所以它们之间的区别可能是寻找提示的地方。

要找出根记录器上的配置处理程序的配置,可以使用grep basicConfig()addHandler()的相关源代码。

另外,你可以明确地添加处理程序,而不是依靠basicConfig()来为你做它:

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

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

+0

感谢您的帮助 – Hernan 2011-05-07 18:00:51

0

如果你认为这是一个特定的模块,尝试冻结代码,使用cx_freeze,或Py2exe。这将创建并执行可执行文件,并将它所需的模块放入其中,以便它不依赖于系统上的模块。

+0

感谢您的建议。看来我的程序导入的一个模块仅在服务器中记录了一些内容,然后我的程序配置了日志记录模块。那么所有的日志都不是我想要的。如果在我的程序中,我会在第一行中导入和配置日志记录。然后,一切都按我想要的方式工作。 – Hernan 2011-05-06 09:23:03

0

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

相关问题