如何根据变量值设定Python日志级别?
我需要根据一个变量的值来改变日志记录的级别。例如:
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)
日志级别其实就是一些数字,而 CRITICAL
、WARNING
等值只是一些常量。你可以通过一些简单的规则,把一个值(比如 accel
)转换成对应的日志级别,这样比起写很多 if
/ else
语句要更清晰易懂。