Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

logging time format millisecond precision decimalsign

410 views
Skip to first unread message

Alex van der Spek

unread,
Jul 20, 2012, 9:00:46 AM7/20/12
to
I use this formatter in logging:

formatter = logging.Formatter(fmt='%(asctime)s \t %(name)s \t %(levelname)s
\t %(message)s')

Sample output:

2012-07-19 21:34:58,382 root INFO Removed - C:\Users\ZDoor\Documents

The time stamp has millisecond precision but the decimal separator is a
comma.

Can I change the comma (,) into a period (.) and if so how?

Thanks in advance,
Alex van der Spek

Peter Otten

unread,
Jul 20, 2012, 10:31:52 AM7/20/12
to pytho...@python.org
I think you have to subclass Formatter.formatTime(). Here's a monkey-
patching session to get you started:

>>> import logging
>>> logging.basicConfig(format="%(asctime)s")
>>> logging.getLogger().error("foo")
2012-07-20 16:17:39,364
>>> _formatTime = logging.Formatter.formatTime
>>> def formatTime(*args):
... return _formatTime(*args).replace(",", ".")
...
>>> logging.Formatter.formatTime = formatTime
>>> logging.getLogger().error("foo")
2012-07-20 16:20:20.838

See also

http://docs.python.org/dev/py3k/library/logging.html#logging.Formatter.formatTime

"""
Changed in version 3.3: Previously, the default ISO 8601 format was hard-
coded as in this example: 2010-09-06 22:38:15,292 where the part before the
comma is handled by a strptime format string ('%Y-%m-%d %H:%M:%S'), and the
part after the comma is a millisecond value. Because strptime does not have
a format placeholder for milliseconds, the millisecond value is appended
using another format string, '%s,%03d' – and both of these format strings
have been hardcoded into this method. With the change, these strings are
defined as class-level attributes which can be overridden at the instance
level when desired. The names of the attributes are default_time_format (for
the strptime format string) and default_msec_format (for appending the
millisecond value).
"""

David Bolen

unread,
Jul 20, 2012, 2:50:28 PM7/20/12
to
I do it by:

1. Replacing the default date format string to exclude ms.
2. Including %(msecs)03d in the format string where appropriate. Using 'd'
instead of s truncates rather than shows the full float value.

So in your case, I believe that changing your formatter creation to:

formatter = logging.Formatter(fmt='%(asctime)s.%(msecs)03d \t %(name)s \t %(levelname)s \t %(message)s', '%Y-%m-%d %H:%M:%S')

should work. This uses the same date format as the default, but
without ms, though of course you could also opt to make any other date
format you prefer.

-- David
0 new messages