mirror of
https://github.com/mongodb/mongo.git
synced 2024-11-24 16:46:00 +01:00
51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
"""
|
|
Custom formatters for the logging handlers.
|
|
"""
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import logging
|
|
import sys
|
|
import time
|
|
|
|
|
|
class ISO8601Formatter(logging.Formatter):
|
|
"""
|
|
An ISO 8601 compliant formatter for log messages. It formats the
|
|
timezone as an hour/minute offset and uses a period as the
|
|
millisecond separator in order to match the log messages of MongoDB.
|
|
"""
|
|
|
|
def formatTime(self, record, datefmt=None):
|
|
converted_time = self.converter(record.created)
|
|
|
|
if datefmt is not None:
|
|
return time.strftime(datefmt, converted_time)
|
|
|
|
formatted_time = time.strftime("%Y-%m-%dT%H:%M:%S", converted_time)
|
|
timezone = ISO8601Formatter._format_timezone_offset(converted_time)
|
|
return "%s.%03d%s" % (formatted_time, record.msecs, timezone)
|
|
|
|
@staticmethod
|
|
def _format_timezone_offset(converted_time):
|
|
"""
|
|
Returns the timezone as an hour/minute offset in the form
|
|
"+HHMM" or "-HHMM".
|
|
"""
|
|
|
|
# Windows treats %z in the format string as %Z, so we compute the hour/minute offset
|
|
# manually.
|
|
if converted_time.tm_isdst == 1 and time.daylight:
|
|
utc_offset_secs = time.altzone
|
|
else:
|
|
utc_offset_secs = time.timezone
|
|
|
|
# The offset is positive if the local timezone is behind (east of) UTC, and negative if it
|
|
# is ahead (west) of UTC.
|
|
utc_offset_prefix = "-" if utc_offset_secs > 0 else "+"
|
|
utc_offset_secs = abs(utc_offset_secs)
|
|
|
|
utc_offset_mins = (utc_offset_secs / 60) % 60
|
|
utc_offset_hours = utc_offset_secs / 3600
|
|
return "%s%02d%02d" % (utc_offset_prefix, utc_offset_hours, utc_offset_mins)
|