python中语句的条件日志级别?

时间:2014-06-05 16:09:46

标签: python logging

有没有办法动态设置我希望将语句记录为哪个日志级别?

我有这段代码:

logging.info("Data Set Size => {0}".format(len(data)))
logging.info("Training Set Size => {0}".format(len(train)))
logging.info("Test Set Size => {0}".format(len(test)))
logging.info("Entire data set allocated => {0}".format(len(data) == len(train) + len(test)))

根据我设置的格式,它很好地输出与此相似的东西:

root        : INFO     Data Set Size => 10000
root        : INFO     Training Set Size => 7500
root        : INFO     Test Set Size => 2500
root        : INFO     Entire data set allocated => True

现在,我的问题是,如果最后一行中的逻辑检查是False,我可以将该级别设置为.warning吗?

我可以这样做:

if len(data) == len(train) + len(test):
    logging.info("Entire data set allocated => {0}".format(True)
else:
    logging.warning("Entire data set allocated => {0}".format(False)

但是,有没有办法用更少的行来做到这一点?

3 个答案:

答案 0 :(得分:4)

使用Logger.log()代替以关卡命名的函数;这需要一个级别作为第一个参数:

entire_set = len(data) == len(train) + len(test)
logging.log(logging.WARNING if entire_set else logging.INFO,
            "Entire data set allocated => {0}".format(entire_set))

logging.warning()logging.info()函数只是使用给定日志级别调用logging.log()的快捷方式。

您可能希望切换到使用专用的Logger对象,而不是使用模块级函数;它允许您更精细地配置日志记录,并通过其记录器名称跟踪日志消息的来源。

答案 1 :(得分:1)

您需要实现条件开关。含义:您需要一个if / else子句。如果需要if / else子句,则无法使其更短"比你拥有它。使这个显着缩短的唯一方法是你想出一种不需要区分两种情况的方法。

然后我需要问一下:为什么你想用更短的代码呢?你提出的代码是完全可读的。

在您当前的提案中,您应该删除.format(True).format(False)片段(结果是常量且已知,因此您可以对其进行硬编码)。然而,这并没有真正缩短您的代码。

答案 2 :(得分:-1)

如果您希望所有以下信息记录进入警告记录,您可以通过警告功能替换信息功能,如下所示:

if len(data) == len(train) + len(test):
    pass
else:
    logging.info = logging.warning

因此,在每次跟踪logging.info语句时,您都不需要进行此测试。如果这对你有用,当然取决于其余的日志代码。

我不太明白为什么要增加语句的日志记录级别。通常情况相反。如果一个临界条件失败,则用

增加loglevel
logging.setLevel

并且所有没有信息级别的日志记录语句都具有警告级别。由于info语句包含在日志记录中,因此通常不需要增加语句本身的级别。