使用tzoffset记录时间戳

时间:2017-01-23 10:26:41

标签: python logging

我正在使用python日志记录模块来记录消息。我需要在日志文件中使用以下类型的日期格式化程序。我怎么能这样做?

2016-11-29T06:12:59.519908+05:00

Year-Month-DateTHour:Min:Sec.microsec+timezone

目前我正在使用此

formatter = logging.Formatter('%(asctime)s.%(msecs)06d %(levelname)s %(message)s',datefmt='%Y-%m-%dT%H:%M:%S')

产生以下内容:

2017-01-23T01:50:23.000606

我无法添加时区信息。

1 个答案:

答案 0 :(得分:0)

这里的问题是处理毫秒,因为在指定格式时处理方式不同。

我们需要子类logging.Formatter来覆盖formatTime方法并从record.msecs获取毫秒,就像original formatTime函数

一样
import logging
import time
import pytz
from time import mktime
from datetime import datetime


class DateFormatter(logging.Formatter):
    DATE_FORMAT = '%Y-%m-%dT%H:%M:%S,%%03d%z'

    def __init__(self, timezone=None, *args, **kwargs):
        self._timezone = timezone
        super(DateFormatter, self).__init__(*args, **kwargs)

    def formatTime(self, record, datefmt=None):
        ct = self.converter(record.created)
        dt = datetime.fromtimestamp(mktime(ct) + record.msecs / 1000., self._timezone)
        return dt

r = logging.getLogger()
h = logging.StreamHandler()

timezone = pytz.timezone('Asia/Jerusalem')
fmt = DateFormatter(timezone, '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
h.setFormatter(fmt)

r.addHandler(h)
r.error('something bad!')

此代码输出:

2017-01-23 13:45:42.466178+02:00 - root - ERROR - something bad!

更新

另一个问题是日志记录不使用datetimetime_struct没有时区,所以在上面更新的代码中我将对象从time_struct转换为日期时间(可能)成本绩效)。

时区应该从外部提供,因为日志记录不包含时区。