Python中如何为语句设置条件日志级别?

6 投票
3 回答
4571 浏览
提问于 2025-04-18 08:45

有没有办法动态设置我想要的日志级别,也就是说,想让某个信息以什么级别记录?

我有这样的代码:

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 个回答

-1

如果你想把所有的信息日志都变成警告日志,你可以把信息函数替换成警告函数,像这样:

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

这样你就不需要在每个 logging.info 的语句后面都做这个测试了。当然,这样做是否有用还得看你其他的日志代码。

我不太明白你为什么想提高某个语句的日志级别。通常情况下,人们是反过来做的。如果有一个关键条件失败了,通常会提高日志级别,用

logging.setLevel

这样所有不是信息级别的日志都会变成警告级别。因为信息日志已经包含在日志中了,所以通常不需要单独提高这个语句的级别。

1

你需要实现一个条件判断,也就是说,你需要用到if/else语句。既然需要用到if/else,就没有办法把它写得比你现在的更简洁。想要大幅度缩短代码,唯一的办法就是找到一种不需要区分两种情况的方法。

我还想问一下:你为什么想要把代码写得更短呢?你现在的代码其实已经很容易理解了。

在你现在的代码中,你可以去掉.format(True).format(False)这部分(因为结果是固定的,大家都知道,所以可以直接写上去)。不过,这样做其实并不会让你的代码变得更短。

8

使用 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 对象,而不是直接用模块里的函数;这样做可以让你更细致地设置日志记录,并且可以通过日志记录器的名字来追踪日志信息的来源。

撰写回答