Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于变量值的Python日志记录级别?_Python_Logging - Fatal编程技术网

基于变量值的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:the
next()
调用当然可以很容易地封装在函数中。重点在于您不选择日志便利函数,而只选择日志级别。这当然是正确的方向。我希望避免在“级别”中明确混合值和日志级别(在多次使用后变旧),并有一个通用的日志继承权。可能会传递一个元组(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)