所以我想将日志记录添加到我一直在维护的一个小的内部命令行实用程序中。(实际上,我正在将其转换为相当难看的手动编码日志记录以使用 Python 的logging
模块;并在此过程中清理一些缺陷)。
首先,我想保留现有的行为、缺陷和所有,以供遗留使用。任何可能依赖于它已经发出的无关警告的脚本都不应该因为我正在做的事情而中断。新功能应该通过-v
开关实现,在 OptionParser 中实现为type=count
(根据古老的 Unix/Linux 约定)。这里的问题是,单个-v
将详细程度设置为 -1 到 0(零)......具有讽刺意味的是,至少抑制了来自 Paramiko 库的一条警告消息(找不到记录器“paramiko.transport”的处理程序)。从那里我想支持最多四个附加-v
选项,并使用这些选项logging.setLevel()
逐渐变得更详细,从logging.CRITICAL
仅到logging.DEBUG
.
问题来了!
我可以很容易地使用类似的东西:
if opts.verbosity == 0: # default is -1 do NOTHING
# 0 ironically makes it slightly quieter
logging.getLogger().addHandler(logging.NullHandler())
elif opts.verbosity > 0:
logging.basicConfig()
logging.getLogger().setLevel(50 - min(40, 10*opts.verbosity))
# UGLY BUT IT WORKS.
# logging.CRITICAL is 50,
# each -v reduces log filter by 10 down to 10
换句话说,我将我的-v
开关计数转换为十的倍数,然后从最不冗长的到最冗长的部分减去。(顺便说一下,这是 Python2.7.x)。
我注意到这logging.basicConfig()
消除了“未找到句柄”警告,并暴露了一些潜在的错误消息,只要该实用程序投入生产(多年),这些错误消息就已经(无害地)发生。(所以,如果我按照预期从默认值 0 开始,那么我会向用户引入令人担忧的噪音。
但我的问题是:是否有更“正确”的方式将数字冗长设置转换为logging.setLevel()
? 使用这个实现细节(与等相关的数值logging.CRITICAL, logging.ERROR, logging.WARN,...
)似乎很脏。
当然,我不能成为唯一使用-vvv
Python 标准OptionParser
和logging
模块的人。但是阅读文档和谷歌搜索并没有找到任何关于此的“最佳实践”。