基于变量值的Python日志记录级别?
我需要根据变量的值更改日志记录级别。例如:基于变量值的Python日志记录级别?,python,logging,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 e
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)
我的代码中都有这样的实例。有更好的方法吗?您可以创建一个函数,该函数接受变量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")
是,请改用
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)
导入系统
#将加速度值映射到日志级别
级别=(
(10.0,记录。关键),
(2.0,日志记录。警告),
(1.0,logging.INFO),
(-sys.maxsize,logging.DEBUG)
)
logging.log(如果lev[0],则lev的级别为next(lev[1])你总是以
logging.info
或logging.debug
作为结束。因为当accel>=10.0
为真时,accel>=2.0
也是真的。除了第一次测试之外,你想用elif
而不是if
。谢谢!我把实际代码编辑得很简单。修正了。真,但由于它是一次性代码,我正在寻找更高级别的模板,而不是增加函数调用的开销,但上述操作增加了视觉和执行的复杂性,在空间和清晰度上没有任何改进。但这确实表明我实际上是在对数据进行装箱,而日志记录只是一个结果。我想我需要一个数据分类器,以及一个将分类映射到日志级别的通用日志包装器。@user1366715:thenext()
调用当然可以很容易地封装在函数中。重点在于您不选择日志便利函数,而只选择日志级别。这当然是正确的方向。我希望避免在“级别”中明确混合值和日志级别(在多次使用后变旧),并有一个通用的日志继承权。可能会传递一个元组(accel,(10.0,2.0,1.0,0.0))?我将标记这一点作为答案,因为这是最好的方法,尽管我需要进行一些实验,直到找到最适合我特定需要的方法。谢谢!
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)