【问题标题】:Using `str.format` to template log messages使用 `str.format` 模板化日志消息
【发布时间】:2017-02-23 22:23:17
【问题描述】:

我正在尝试在我的日志记录中使用str.format 样式模板。似乎无法正常工作。

>>> import logging
>>> logging.basicConfig(filename='/tmp/example', format='{asctime} - {levelname} - {message}', style='{', level=logging.INFO)
>>> logger = logging.getLogger(__name__)
>>> logger.warning('blah')
>>> logger.warning('{foo:03d}', {'foo': 42})

实际输出:

2017-02-23 16:11:45,695 - WARNING - blah
2017-02-23 16:12:11,432 - WARNING - {foo:03d}

预期输出:

2017-02-23 16:11:45,695 - WARNING - blah
2017-02-23 16:12:11,432 - WARNING - 042

我在这个设置中缺少什么?

我不想看到在记录之前格式化字符串的解决方法,或者使用旧的 % 样式模板的Python 2 solutions

【问题讨论】:

    标签: python logging string-formatting python-3.6


    【解决方案1】:

    显然style 参数仅适用于有关消息的信息(例如时间戳、严重性等),而不适用于实际消息。

    来自logger.warning的文档字符串:

    warning(msg, *args, **kwargs) method of logging.Logger instance
        Log 'msg % args' with severity 'WARNING'.
    

    似乎msg 总是使用旧式格式进行格式化,因此甚至不考虑记录器的style 参数。

    logging HOWTO 包含更多信息:

    ...您不能使用str.format() 或直接进行记录调用 string.Template 语法,因为日志包内部使用 %-formatting 合并格式字符串和变量参数。 在保持向后兼容性的同时不会改变这一点, 因为现有代码中的所有日志调用都将是 使用%-格式字符串。

    【讨论】:

      【解决方案2】:

      “我不想看到在记录之前格式化字符串的变通办法”为什么不呢?旧样式在记录之前对其进行格式化...您可以在logger.warning 调用中放入行来进行格式化,它在功能上没有任何改变。如果{foo:42} 只是更大字典中的一个成员,您可以执行以下操作:

      for key,val in warningsDictionary.iteritems():
          logger.warning('{'+key+':'+format(val,'03')+'}')
      

      这是否足够取决于您实际尝试做的事情。

      【讨论】:

      • 如果我们在调用 logger 之前格式化字符串,那么日志聚合的东西就不能正常工作
      • 您能说得更具体些吗?它怎么不能正常工作?
      • 考虑诸如logger.warning('problem with thing %(thing_id)03d', {'thing_id': 42})之类的消息。这将在输出中产生类似problem with thing 042 的日志消息。但是,sentry等日志聚合服务会将problem with thing 001problem with thing 042problem with thing 069组合在一起,作为同一警告的不同表现形式。如果您自己对日志记录进行模板化,而不是让记录器处理,您将失去所有功能,并且可能会收到数百万个不同的警报(应该只有 1 个警报,有数百万次点击)。
      猜你喜欢
      • 2023-01-12
      • 2013-11-29
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多