当前位置: 首页 > 面试题库 >

懒惰的记录器消息字符串评估

郭凡
2023-03-14
问题内容

我在python应用程序中使用标准的python日志记录模块:

导入日志
logging.basicConfig(level = logging.INFO)
logger = logging.getLogger(“ log”)
而True:
  logger.debug('愚蠢的日志消息“ +''.join([str(i)for range in 20(20)]))
  # 做点什么

问题是,尽管未启用调试级别,但在每次循环迭代时都会评估该愚蠢的日志消息,这会严重损害性能。

有什么解决办法吗?

在C ++中,我们log4cxx提供了提供以下宏的软件包:
LOG4CXX_DEBUG(logger, messasage)
有效评估为

如果(log4cxx :: debugEnabled(logger)){
    log4cxx.log(logger,log4cxx :: LOG4CXX_DEBUG,消息)
}

但是,由于Python(AFAIK)中没有宏,是否有一种有效的日志记录方法?


问题答案:

日志记录模块已经对您要执行的操作提供了部分支持。做这个:

log.debug("Some message: a=%s b=%s", a, b)

…代替这个:

log.debug("Some message: a=%s b=%s" % (a, b))

日志记录模块足够聪明,不会产生完整的日志消息,除非该消息实际记录在某处。

要将此功能应用于您的特定请求,可以创建一个lazyjoin类。

class lazyjoin:
    def __init__(self, s, items):
        self.s = s
        self.items = items
    def __str__(self):
        return self.s.join(self.items)

像这样使用它(请注意使用生成器表达式,这会增加延迟):

logger.info('Stupid log message %s', lazyjoin(' ', (str(i) for i in range(20))))

这是展示此作品的演示。

>>> import logging
>>> logging.basicConfig(level=logging.INFO)
>>> logger = logging.getLogger("log")
>>> class DoNotStr:
...     def __str__(self):
...         raise AssertionError("the code should not have called this")
... 
>>> logger.info('Message %s', DoNotStr())
Traceback (most recent call last):
...
AssertionError: the code should not have called this
>>> logger.debug('Message %s', DoNotStr())
>>>

在演示中,logger.info()调用遇到了断言错误,而logger.debug()并没有解决。



 类似资料:
  • 问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况

  • 我正在阅读HadleyWickhams关于Github的书,特别是关于懒惰评估的这一部分。在那里,他给出了一个懒惰求值结果的例子,在函数的添加部分。让我引用这一点: 这个[惰性评估]在使用lApplication或循环创建闭包时很重要: x在您第一次调用其中一个加法器函数时被延迟计算。此时,循环完成,x的最终值为10。因此,所有加法器函数都会在其输入中添加10,可能不是您想要的!手动强制评估解决了

  • 问题内容: SonarQube抱怨“ 字符串不包含格式说明符” 。使用时,尤其是方法“ ”。例如 它指的是这个规则:https : //wiki.sei.cmu.edu/confluence/display/c/FIO47-C.+Use+valid+format+strings 但是,在此规则中,我们可以找到以下引号: 每个转换规范都以%字符开头,后跟(按顺序) 零个或多个标志(以任何顺序),这些

  • 我的大型应用程序包含对大型代码的处理,其中也包括字符串文字。 作为代码清理activity的一部分,我将所有字符串文字声明为字符串final静态常量变量。 在此之后,我希望我的应用程序的性能有所改善。 我正在使用SLF4j进行日志记录。 我的问题是--日志中的字符串也应该声明为最终常量? 例如,用于logger.info(“我的日志”); 是否也会消耗堆内存空间?还是我应该让他们保持原样?

  • 问题内容: 例如,如果我有以下语句: 如果foo1为true,python将检查foo2的条件吗? 问题答案: 是的,Python懒惰地评估布尔条件。 该文件说, 表达式x和y首先计算x;如果x为假,则返回其值;否则,将评估y并返回结果值。 表达式x或y首先计算x; 如果x为true,则返回其值;否则,将评估y并返回结果值。

  • 我已经写了两个版本的nqueens问题,我认为它们应该有相似的效率,但事实并非如此。我认为这是由于哈斯克尔的懒惰评估行为。有人能解释一下下面的例子是如何工作的吗, 您可以通过调用nqueens1 8 8或nqueens2 8 8对其进行评估,以对大小为8的板进行评估。 虽然nqueens2工作效率很高,但nqueens1存在性能问题。我相信这是因为递归调用(nqueens n(k-1))被多次评估