我正在使用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
我无法添加时区信息。
答案 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!
另一个问题是日志记录不使用datetime
而time_struct
没有时区,所以在上面更新的代码中我将对象从time_struct
转换为日期时间(可能)成本绩效)。
时区应该从外部提供,因为日志记录不包含时区。