跳转到主要内容

在Python 2日志中指定UTC偏移量

项目描述

Python 2的日志模块不支持在datetime格式字符串中使用时区偏移量 %z。以下是一个示例失败模式:

import logging
datefmt = '%Y-%m-%d %H:%M:%S%z'
logging.basicConfig(format='%(asctime)s %(message)s', datefmt=datefmt)
logging.warning("Dude, where's my tzinfo?")  # it's about 6.20 pm here in Chicago
# 2017-02-27 18:23:05+0000 Dude, where's my tzinfo?
                     ^^^^^

简单地省略时区偏移量可能是可以接受的,或者甚至可能简单地拒绝本地化并仅在UTC中记录,但指定本地化时间 指定零偏移量肯定是不正确的。标记为 ^ 的部分是不正确的,偏移时间戳应该看起来更像是这样

import pytz
from datetime import datetime
chicago_now = datetime.now(tz=pytz.timezone('America/Chicago'))
print chicago_now.strftime(datefmt)
# 2017-02-27 18:23:13-0600

实际上,这就是在Python 3下运行时的日志输出 确实 看起来的样子。但在Python 2中,%z指令被删除。此模块提供了一个 LocalFormatter,旨在作为直接替换项,以便在Python 2下正确处理时区偏移量

import logging, logging_tz
datefmt = '%Y-%m-%d %H:%M:%S%z'
logger = logging.getLogger('wat')
handler = logging.StreamHandler()
formatter = logging_tz.LocalFormatter(fmt='%(asctime)s %(message)s', datefmt=datefmt)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.warning("Ah, there's my tzinfo!")
# 2017-02-27 18:25:53-0600 Ah, there's my tzinfo!

此外,还提供了一个 ChicagoFormatter,作为一种便利,以减轻那些足够疯狂将后端运行在CST而不是UTC上的人的痛苦。

常见问题解答

问题

如何安装这个库?

答案

使用 pip install logging_tz 安装,然后您可以使用 logging_tz.LocalFormatter 而不是 logging.Formatter

问题

您应该在UTC中记录。您为什么要记录本地时间呢?

答案

是啊,我想。虽然正确处理日期格式至少比完全搞砸要好。

问题

这是Python中的一个bug吗?

答案

嗯,可以说不是,因为时区偏移量的%z指令在Python 2文档time.strftime表中没有列出。但在Python 3文档中是有的。

问题

人们真的问过你这些问题吗?我敢打赌你只是为FAQ编造了这些问题。

答案

这是一个非常好的问题——事实上,这是我经常问自己的问题。

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源代码分发

本发布没有可用的源代码分发文件。请参阅生成分发存档的教程。

构建分发

logging_tz-0.1-py2-none-any.whl (5.7 kB 查看散列值)

上传时间: Python 2

由以下提供支持