1

根据此处的文档此处的答案,要求我的记录器的 logLevel 应该返回此级别名称之一

_levelNames = {
    CRITICAL : 'CRITICAL',
    ERROR : 'ERROR',
    WARNING : 'WARNING',
    INFO : 'INFO',
    DEBUG : 'DEBUG',
    NOTSET : 'NOTSET',
    'CRITICAL' : CRITICAL,
    'ERROR' : ERROR,
    'WARN' : WARNING,
    'WARNING' : WARNING,
    'INFO' : INFO,
    'DEBUG' : DEBUG,
    'NOTSET' : NOTSET,
}

但是当我打电话时

print logging.getLevelName("debug")

我得到:

关卡调试

所以我不能以一种舒适的方式做类似的事情:

logger.setLevel(foo)

其中 fo 是我从其他方法获得的字符串...

任何建议为什么?

谢谢

4

4 回答 4

2

医生根本不是这么说的。它说如果你传递一个映射到预定义日志级别之一的整数,你会得到一个打印良好的字符串版本:

>>> print(logging.getLevelName(logging.DEBUG))
DEBUG

否则,如您所述,您将获得“级别 x”。

链接的答案明确指出,从字符串到整数不是该函数所做的。

于 2017-02-06T09:30:11.840 回答
2

链接的文档没有说明您声称它所说的内容。这就是文档字符串getLevelName实际所说的内容:

返回日志级别 lvl 的文本表示。如果级别是预定义级别 CRITICAL、ERROR、WARNING、INFO 或 DEBUG 之一,那么您将获得相应的字符串。

不是你的情况,因为“调试”不是预定义的级别之一。

如果您使用 addLevelName() 将级别与名称关联,则返回与 lvl 关联的名称。

不是你的情况,因为你没有提到使用addLevelName.

如果传入与定义的级别之一相对应的数值,则返回相应的字符串表示形式。

不是您的情况,因为您没有传递数值。

否则,返回字符串“Level %s”% lvl。

这是您的情况,因此预期的返回logging.getLevelName("debug")值为"Level debug"

于 2017-02-06T10:40:58.663 回答
2

以前的答案充分讨论了这个问题,但对于一般查看,我想添加一种替代方法来将日志记录级别字符串转换为内部整数值。

getattr(logging, level_string)

为什么?仅仅因为该logging.getLevelName()函数有一个令人讨厌的功能,可以为无效参数返回那些“X 级”字符串。

假设您正在编写一个 Flask 应用程序,该应用程序允许在实例配置文件中设置日志记录级别(例如;LOGGING_LEVEL = "WARNING")。这在我的书中有资格作为用户输入,在我看来,您应该能够处理无效值。第三个参数,备用值,允许我们这样做:

app = Flask(...)
app.config.from_pyfile('application.conf')
app.logger.setLevel(
    getattr(
        logging,
        str(app.config.get('LOG_LEVEL', 'DEBUG')),
        logging.DEBUG
    )
)

现在,您的代码应该能够容忍错误/丢失的配置值,并在这种情况下默认为 DEBUG 日志记录模式。

如果您的日志记录级别值不是用户输入(因此不太可能丢失或无意义),那么所有这些都是不必要的,并且与您无关。那你就好了logging.getLevelName(),我想。

我的 5 美分是,编写日志模块的人错过了一个明显的机会,通过为我们提供可选的第三个函数参数(后备值)来解决所有这些问题,但它就是这样......

希望这可以帮助某人。

于 2018-10-25T13:32:19.883 回答
1

我将为您提供有关您的疑问的更多详细信息:

logging.getLevelName('DEBUG')输出为 10

logging.getLevelName(10)输出为调试

看到这个logging.getLevelName。它可能会澄清你的疑惑。

于 2017-02-06T10:01:04.483 回答