在python 2日志中指定utc偏移量
logging-tz的Python项目详细描述
python 2日志模块不支持在datetime格式字符串中使用时区偏移量%z。故障模式示例如下:
importloggingdatefmt='%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中登录,但是指定本地化时间和指定零偏移量肯定是错误的。标记为^的部分不正确,偏移时间戳应该更像这样:
importpytzfromdatetimeimportdatetimechicago_now=datetime.now(tz=pytz.timezone('America/Chicago'))printchicago_now.strftime(datefmt)# 2017-02-27 18:23:13-0600
实际上,如果在python 3下运行,日志输出看起来就是这样的。但是在python 2中,%z指令被删除。此模块提供一个LocalFormatter作为替换项,以在python 2下提供时区偏移的正确处理:
importlogging,logging_tzdatefmt='%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上运行其后端的人的痛苦。
常见问题解答
- q: 如何安装此库?
- a:
- pip install logging_tz,然后您可以使用logging_tz.LocalFormatter,而不是logging.Formatter。
- q:
- 您应该登录UTC。你为什么要登录本地时间?
- a:
- Yeah, I guess。虽然正确处理日期格式至少比完全弄脏它要好。
- q:
- 这是python中的一个bug吗?
- a:
- 嗯,可以说不是,因为时区偏移量的%z指令没有列在Python 2 documentation中的time.strftime表中。不过,它是there in the Python 3 docs。
- q: 人们真的问过你这些问题吗?我敢打赌你只是为常见问题做了些补充。
- a:
- 这是个很好的问题-事实上,这是我经常问自己的问题。