Python 日志在不同系统中显示不同的格式/级别
我有一个用Python写的简单命令行程序。这个程序使用日志模块来在屏幕上输出信息,配置方式如下:
logging.basicConfig(level=logging.INFO, format='%(levelname)-8s %(message)s')
奇怪的是,在我的笔记本电脑上,程序可以以正确的级别(INFO)和我想要的格式输出日志,但当我在服务器上运行这个程序时,它只记录错误和警告,而且格式也不一样。
在这两个系统上,我都是在一个虚拟环境中运行Python 2.7。不过这两个环境并不完全相同。
我觉得可能有某个模块在改变我的配置。我不明白为什么这个问题只在服务器上出现,但有没有办法找出是哪个模块在作怪呢?
提前谢谢你,
3 个回答
如果你觉得是某个模块的问题,可以试试把代码“冻结”起来,使用cx_freeze或者Py2exe。这会生成一个可执行的文件,并把它需要的模块都放进去,这样就不需要依赖系统上的模块了。
Python的日志系统配置在一个Python进程中是独一无二的。如果在某个进程中有人更改了日志的配置,那么这个进程中产生的所有日志都会按照新的配置来记录。
在日志记录中,basicConfig()
这个功能如果根日志器已经配置了处理器,就不会做任何事情(文档中有说明)。你的basicConfig()
调用可能被忽略了,因为服务器中的其他代码已经为根日志器配置了一些处理器。
一般来说,库代码不应该添加处理器,这应该由应用程序开发者来负责。不过,如果你是在使用某个框架开发网页应用,那个框架可能已经为你配置了一些处理器。
你提到“在服务器上”,但不太清楚你是指服务应用,还是只是运行在某台机器上的工具脚本,而那台机器恰好是服务器。正如你所说,虚拟环境之间有些许不同,所以它们之间的差异可能是寻找线索的地方。
要找出是什么在配置根日志器的处理器,你可以在相关的源代码中搜索basicConfig()
或addHandler()
。
另外,你也可以明确地添加一个处理器,而不是依赖basicConfig()
来为你做这件事:
f = logging.Formatter('%(levelname)-8s %(message)s')
h = logging.StreamHandler()
h.setFormatter(f)
logging.getLogger().addHandler(h)
不过,如果根日志器上也添加了其他控制台处理器,这可能会导致出现多个消息。