【问题标题】:python logging msecs format with {} style具有 {} 样式的 python 日志记录毫秒格式
【发布时间】:2018-01-30 09:16:11
【问题描述】:

对于 Python 3.6 的日志记录:

我想让{msecs} 在使用style="{" 时以格式字符串工作。 我只想要 3 位数的毫秒。 但是,以下所有尝试都失败了:
{msecs:3.0f}
{msecs:03d} # this is in the official documentation and doesn't work
我在这里做错了什么?我的总体印象是str.format() 中的format_specfmt 参数中效果不佳

import logging
rl = logging.getLogger()
formatter_stdout = logging.Formatter(
    fmt='{asctime},{msecs:03d} {message}',
    style='{',
)

ch = logging.StreamHandler()
ch.setFormatter(formatter_stdout)
rl.addHandler(ch)

rl.warning('asdf')

【问题讨论】:

  • 你试过f'{msecs:0.3f}' 吗?
  • 得到奇怪的结果:2018-01-30 03:22:28,904,904.217 asdf
  • 哦,我明白了。 f'{msecs:3.0f}' 然后工作。但不幸的是,这不能解决您的格式化程序问题。

标签: python logging format-specifiers


【解决方案1】:

您不能将日期/时间的格式定义为 fmt 参数的一部分。对此有单独的datefmt 参数。但是,如果不定义自定义 formatTime() 函数,您将无法使用它来格式化毫秒,或者按照 16.6.4. Formatter Objects 部分中的以下注释:

在 3.3 版中更改:以前,默认的 ISO 8601 格式是 硬编码,如本例所示:2010-09-06 22:38:15,292 逗号之前的部分由 strptime 格式字符串处理 ('%Y-%m-%d %H:%M:%S'),逗号后面的部分是毫秒 价值。因为 strptime 没有格式占位符 毫秒,毫秒值使用另一种格式附加 string, '%s,%03d' — 这两个格式字符串都已 硬编码到这个方法中。随着更改,这些字符串被定义 作为可以在实例中覆盖的类级属性 需要时水平。属性的名称是 default_time_format(用于 strptime 格式字符串)和 default_msec_format(用于附加毫秒值)。

您可以在自定义formatTime() 函数中自己格式化毫秒,也可以使用此函数的默认实现,只设置格式化程序对象的default_msec_format 属性。

formatter_stdout.default_msec_format = '%s,%03d'

fmt 参数中,您使用{asctime} 占位符引用已格式化日期/时间。

【讨论】:

    【解决方案2】:

    这行得通:

    fmt='{asctime}.{msecs:03.0f} …'
    

    不知道为什么它使用浮点数来表示毫秒,但确实如此。

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 2013-12-15
      • 2021-10-26
      • 2023-03-25
      • 2011-07-13
      • 2016-03-23
      • 2015-12-17
      • 1970-01-01
      • 2018-01-22
      相关资源
      最近更新 更多