Python 3.7日志记录:f字符串与%

时间:2019-01-25 15:09:58

标签: python python-3.x

我在一个项目中遇到了性能问题,我将其范围缩小到了一些日志行。似乎即使我的日志记录工具高于正在记录的行的级别,也可以计算f字符串。

请考虑以下示例以演示该问题:

import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger('MyLogger')

class MyClass:
    def __init__(self, name: str) -> None:
        self._name = name
    def __str__(self) -> str:
        print('GENERATING STRING')
        return self._name

c = MyClass('foo')
logger.debug(f'Created: {c}')

运行此示例时,我将在屏幕上打印“ GENERATING STRING”,表明即使我的日志记录级别设置为__str__,并且日志行用于INFO

据我今天所知,解决方案是使用以下内容而不是f字符串。

DEBUG

现在我想着三件事。

  • 我阅读的大多数示例和文档似乎都已经很老了。
  • 该项目仅适用于Python 3.7+(不担心向后兼容)。
  • 我有很多代码行需要更新。

我很想知道其他人在这种情况下会做什么。 logger.debug('Created: %s', c) 是最好的(最现代的)方法吗?如上所述,有没有更现代的方式记录我的日志?

我有很多代码需要更新(修复),我希望与现代最佳实践保持一致。

2 个答案:

答案 0 :(得分:3)

IMO,在您的字符串中使用%s并不是最现代的方法。毫无疑问,大多数开发人员会更喜欢使用f字符串,因为它更加方便且易于读取(和写入)。

但是,有趣的是,您发现一个特定的情况,您可能不想使用f字符串。如果由于优化问题而需要避免自动调用__str__()方法,那么使用%s而不是f字符串可能是一个很好的理由。但是,这也可能表明您可以在程序中进行某些操作以降低__str__()的复杂性。大多数情况下,为对象计算字符串表示形式不需要花费太多时间或资源...

答案 1 :(得分:1)

documentation表示已对日志记录库进行了优化,以使用%s格式设置样式。我不记得确切提到了什么地方,但是几个月前我读了它。

编辑-找到了! https://docs.python.org/3/howto/logging-cookbook.html#formatting-styles
Edit2 -(感谢Robin Nemeth)https://docs.python.org/3/howto/logging.html#optimization