Python:如何从 OptionParser type='count' 记录.setLevel 详细程度?

Jim*_*nis 0 python logging verbosity optionparser

所以我想将日志记录添加到我一直在维护的一个小的内部命令行实用程序中。(实际上,我正在将其转换为使用 Pythonlogging模块的相当丑陋的手动编码日志记录;并在此过程中清理了一些问题)。

首先,我想保留现有的行为,疣等等,以供遗留使用。任何可能依赖于它已经发出的无关警告的脚本都不应该因为我正在做的事情而中断。新功能应该通过-v开关实现,在 OptionParser 中实现为 a 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
Run Code Online (Sandbox Code Playgroud)

换句话说,我将我的-v开关计数转换为 10 的倍数,并从最不详细的到最详细的减去它。(顺便说一下,这是 Python2.7.x)。

我注意到这logging.basicConfig()消除了“未找到句柄”警告,并公开了一些潜在的错误消息,只要该实用程序已投入生产(数年),这些消息就会(无害地)发生。(因此,如果我从默认值 0 开始,正如人们所期望的那样,那么我就会向用户引入令人震惊的噪音。

但我的问题是:有没有更“正确”的方法将数字详细设置转换为logging.setLevel()? 使用这个实现细节(与logging.CRITICAL, logging.ERROR, logging.WARN,...等相关的数值)似乎很脏。

当然,我不能是唯一一个使用-vvvPython 标准OptionParserlogging模块的人。但是阅读文档和谷歌搜索并没有找到任何关于此的“最佳实践”。

tor*_*rek 5

更清洁,至少:

level = {
    1: logging.ERROR,
    2: logging.WARNING,
    3: logging.INFO,
    4: logging.DEBUG
}.get(opts.verbosity, logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

(我也建议从optparseto转换argparse。)