5

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

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)

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

4

2 回答 2

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)

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

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)

日志级别实际上是整数,而CRITICAL,WARNING等值只是常量。有许多方法可以accel通过一些简单的规则将一个值(例如 )转换为匹配的日志级别,以比大量if/else分支更易读的方式。

于 2013-02-27T18:07:04.633 回答
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")
于 2013-02-27T18:04:19.300 回答