diff --git a/cranslib/clogger.py b/cranslib/clogger.py index 1672c913..19648860 100644 --- a/cranslib/clogger.py +++ b/cranslib/clogger.py @@ -6,8 +6,12 @@ # License : GPLv3 # Date : 27/04/2014 +import datetime +import pytz import logging +TZ = pytz.timezone('Europe/Paris') + class CLogger(logging.Logger): """ Crans logger @@ -27,7 +31,7 @@ class CLogger(logging.Logger): self.fh.setLevel(self.fhlevel) # Creates formatter - self.formatter = logging.Formatter('%%(asctime)s - %%(name)s - %(service)s - %%(levelname)s - %%(message)s' % {'service': service}) + self.formatter = CFormatter('%%(asctime)s - %%(name)s - %(service)s - %%(levelname)s - %%(message)s' % {'service': service}, "%Y-%m-%dT%H:%M:%S.%f%z") # Adds formatter to FileHandler self.fh.setFormatter(self.formatter) @@ -41,3 +45,37 @@ class CLogger(logging.Logger): # Adds FileHandler to Handlers self.addHandler(self.fh) + +class CFormatter(logging.Formatter): + """ + This Formatter subclasses the classic formatter to provide a + timezone-aware logging. + """ + + converter = datetime.datetime.fromtimestamp + + def formatTime(self, record, datefmt=None): + """ + Return the creation time of the specified LogRecord as formatted text. + + This method should be called from format() by a formatter which + wants to make use of a formatted time. This method can be overridden + in formatters to provide for any specific requirement, but the + basic behaviour is as follows: if datefmt (a string) is specified, + it is used with time.strftime() to format the creation time of the + record. Otherwise, the ISO8601 format is used. The resulting + string is returned. This function uses a user-configurable function + to convert the creation time to a tuple. By default, time.localtime() + is used; to change this for a particular formatter instance, set the + 'converter' attribute to a function with the same signature as + time.localtime() or time.gmtime(). To change it for all formatters, + for example if you want all logging times to be shown in GMT, + set the 'converter' attribute in the Formatter class. + """ + ct = self.converter(record.created, TZ) + ct = ct.replace(microsecond=int(record.msecs * 1000)) + if datefmt: + s = ct.strftime(datefmt) + else: + s = ct.strftime("%Y-%m-%d %H:%M:%S.%f") + return s