gpt4 book ai didi

Python 日志记录模块发出错误的时区信息

转载 作者:太空狗 更新时间:2023-10-29 20:15:37 25 4
gpt4 key购买 nike

我遇到了 Python 2.7 日志记录模块的问题。我的系统是 Ubuntu 14.04 64 位,我住在意大利(目前是 UTC+1,没有夏令时);系统已正确配置。

我想在当前时区发出日志行,包含正确的时区偏移信息。

考虑以下片段:

#!/usr/bin/env python
import sys
print sys.version_info
import commands
print "System time: %s" % commands.getoutput("date --rfc-3339=seconds")

import logging
import datetime
logging.basicConfig(level=logging.DEBUG, stream=sys.stdout,
format="%(asctime)s:" + logging.BASIC_FORMAT,
datefmt="%Y-%m-%dT%H:%M:%S%z")

logger = logging.getLogger()
logger.info("Something happened")

产生这个结果:

sys.version_info(major=2, minor=7, micro=6, releaselevel='final', serial=0)
System time: 2015-01-09 11:21:44+01:00
2015-01-09T11:21:44+0000:INFO:root:Something happened

因此,系统知道正确的时间和偏移量,而 Python 似乎弄错了时间。

在日期时间文档中,据说对于 strftime 中的 %z,结果是“+HHMM 或 -HHMM 形式的 UTC 偏移量(如果对象是天真的,则为空字符串)”。

所以,我希望得到以下任一结果:

  1. 日志模块想要以 UTC 登录,所以我会得到类似于 10:21.44 和 +0000 的偏移量;
  2. 日志模块想要以本地时间登录,所以我会得到类似于 11:21:44 和 +01000 的偏移量;
  3. 日志记录模块提供简单的日期时间对象,我们绝对没有得到关于偏移量的任何信息。

相反,在这里我似乎得到了一个不可预测的——而且显然是错误的——结果。这是怎么回事?是否可以将日志记录模块配置为执行我想执行的操作而不覆盖 logging.Formatter 对象的转换器函数(当然,我可以在其中执行任何我喜欢的操作,但这对我来说显然是一个错误)?

最佳答案

logging 使用 time 模块,它不将时区存储在时间元组中,time.strftime()datetime 不同。 strftime() 不支持 Python 2 上的 %z。您可以覆盖 Formatter.formatTime() 方法以使用时区感知日期时间对象作为 @dmg suggested :

#!/usr/bin/env python
import logging
from datetime import datetime

import tzlocal # $ pip install tzlocal

def posix2local(timestamp, tz=tzlocal.get_localzone()):
"""Seconds since the epoch -> local time as an aware datetime object."""
return datetime.fromtimestamp(timestamp, tz)

class Formatter(logging.Formatter):
def converter(self, timestamp):
return posix2local(timestamp)

def formatTime(self, record, datefmt=None):
dt = self.converter(record.created)
if datefmt:
s = dt.strftime(datefmt)
else:
t = dt.strftime(self.default_time_format)
s = self.default_msec_format % (t, record.msecs)
return s

logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setFormatter(Formatter("%(asctime)s %(message)s", "%Y-%m-%dT%H:%M:%S%z"))
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.info('something happened')

输出

2015-01-09T18:30:54+0100 something happened

关于Python 日志记录模块发出错误的时区信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27858539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com