我需要根据变量的值更改日志记录级别。例如:
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)
我通过我的代码实现了这一切。还有更好的方法吗?
答案 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)
日志级别实际上是整数,CRITICAL
,WARNING
等值仅仅是常量。您可以通过多种方式将一个值(例如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")