基于变量值的Python日志记录级别?

Bob*_*obC 5 python logging

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

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)
Run Code Online (Sandbox Code Playgroud)

我的代码中都有这些实例。有没有更好的办法?

Mar*_*ers 5

是的,改用该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)
Run Code Online (Sandbox Code Playgroud)

您可以将级别选择封装到一个实用程序函数中:

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)
Run Code Online (Sandbox Code Playgroud)

日志级别都是整数,和CRITICALWARNING等的值仅仅是常数。您可以通过多种简单方法将一个值(例如accel)转换为匹配日志级别的方法有多种,其可读性比大量if/ else分支高。