如何根据变量值设定Python日志级别?

6 投票
2 回答
3713 浏览
提问于 2025-04-17 17:20

我需要根据一个变量的值来改变日志记录的级别。例如:

if accel >= 10.0:
    log_func = logging.critical # Critical for splat event
elif accel >= 2.0:
    log_func = logging.warning  # Warning for high-G
elif accel >= 1.0:
    log_func = logging.info     # Info for normal
else:
    log_func = logging.debug    # Debug otherwise
log_func("Collision with %0.1fG impact.", accel)

我在代码中到处都有这样的情况。有没有更好的方法呢?

2 个回答

3

你可以创建一个函数,这个函数接收一个叫做 accel 的变量,然后返回一个合适的记录日志的函数。这样做会让代码看起来更整洁,也更容易维护。而且,这样做还符合“不要重复自己”的原则。

def logger(accel):
    if accel >= 10.0:
        return logging.critical # Critical for splat event
    if accel >= 2.0:
        return logging.warning  # Warning for high-G
    if accel >= 1.0:
       return logging.info     # Info for normal
   else:
       return logging.debug    # Debug otherwise

然后你就可以像这样使用它:

logger(12)("hello world")
7

是的,使用 Logger.log() 方法会更好,并且你需要传入一个级别常量:

import sys

# Map accel values to log levels
levels = (
    (10.0, logging.CRITICAL),
    (2.0, logging.WARNING), 
    (1.0, logging.INFO),
    (-sys.maxsize, logging.DEBUG)
)

logging.log(next(lev[1] for lev in levels if lev[0] <= accel),
    "Collision with %0.1fG impact.", accel)

你可以把选择级别的过程封装成一个工具函数:

def level_for_accel(accel):
    # return next matching log level for the given accel value
    return next(lev[1] for lev in levels if lev[0] <= accel)

logging.log(level_for_accel(accel), "Collision with %0.1fG impact.", accel)

日志级别其实就是一些数字,而 CRITICALWARNING 等值只是一些常量。你可以通过一些简单的规则,把一个值(比如 accel)转换成对应的日志级别,这样比起写很多 if / else 语句要更清晰易懂。

撰写回答