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

时间:2013-02-27 18:00:37

标签: 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)

我通过我的代码实现了这一切。还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

是的,改为使用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 / {{1}更易读分支。

答案 1 :(得分:2)

您可以创建一个获取变量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")