0

所以我想将日志记录添加到我一直在维护的一个小的内部命令行实用程序中。(实际上,我正在将其转换为相当难看的手动编码日志记录以使用 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,...)似乎很脏。

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

4

2 回答 2

5

至少更清洁:

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

(我建议也转换optparseargparse。)

于 2013-08-06T06:25:58.527 回答
0

(是的,恢复旧帖子)

我最近也想要这样的东西,但我不想使用dict. 这是我的实现:

def logging_level(verbosity):
    """ Converts a verbosity number to a logging level

    Args:
        verbosity - a number, possibly collected from ``argparse``'s ``count``
        action. If ``verbosity`` is out of the range of possible logging levels
        it will be normalized to the nearest level. Does not take into
        consideration custom levels.
    """
    levels = [
        logging.CRITICAL,
        logging.ERROR,
        logging.WARNING,
        logging.INFO,
        logging.DEBUG
    ]

    return levels[max(min(len(levels) - 1, verbosity), 0)]
于 2014-10-16T01:08:55.020 回答