Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/wimglenn/logging_tz
Specify the UTC offset (%z) in Python 2 logging
https://github.com/wimglenn/logging_tz
Last synced: 10 days ago
JSON representation
Specify the UTC offset (%z) in Python 2 logging
- Host: GitHub
- URL: https://github.com/wimglenn/logging_tz
- Owner: wimglenn
- Created: 2017-12-01T01:27:19.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2018-09-20T02:53:18.000Z (over 6 years ago)
- Last Synced: 2024-12-18T12:19:05.511Z (22 days ago)
- Language: Python
- Size: 8.79 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.rst
Awesome Lists containing this project
README
Using local time in Python2 logging
===================================Python 2 logging module doesn't support using a timezone offset ``%z`` in the datetime format string. An example failure mode is shown below:
.. code-block:: python
import logging
datefmt = '%Y-%m-%d %H:%M:%S%z'
logging.basicConfig(format='%(asctime)s %(message)s', datefmt=datefmt)
logging.warning("Dude, where's my tzinfo?") # it's about 6.20 pm here in Chicago
# 2017-02-27 18:23:05+0000 Dude, where's my tzinfo?
^^^^^Simply omitting the time zone offset would perhaps have been admissible, or perhaps even simply refusing to localize and just logging in UTC, but specifying the localized time **and** specifying a zero offset is certainly wrong. The part marked ``^`` is incorrect, an offset timestamp should have looked more like this one:
.. code-block:: python
import pytz
from datetime import datetime
chicago_now = datetime.now(tz=pytz.timezone('America/Chicago'))
print chicago_now.strftime(datefmt)
# 2017-02-27 18:23:13-0600Indeed, that's how the logging output *does* look if run under Python 3. But in Python 2, the ``%z`` directive is dropped. This module provides a ``LocalFormatter`` intended as a drop-in replacement, to provide the correct handling of time zone offsets under Python 2:
.. code-block:: python
import logging, logging_tz
datefmt = '%Y-%m-%d %H:%M:%S%z'
logger = logging.getLogger('wat')
handler = logging.StreamHandler()
formatter = logging_tz.LocalFormatter(fmt='%(asctime)s %(message)s', datefmt=datefmt)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.warning("Ah, there's my tzinfo!")
# 2017-02-27 18:25:53-0600 Ah, there's my tzinfo!Additionally a ``ChicagoFormatter`` is offered as a convenience, to ease the pain for anyone insane enough to run their backend on CST instead of UTC.
FAQ
---Q:
How to install this library?
A:
``pip install logging_tz`` and then you can just use a ``logging_tz.LocalFormatter`` instead of the ``logging.Formatter``.Q:
You should log in UTC. Why would you log in local time anyway?
A:
`Yeah, I guess `_. Although handling the date format correctly is at least better than mucking it up completely.Q:
Is that a bug in Python?
A:
Hmm, arguably not, because the ``%z`` directive for time zone offset is not listed on the ``time.strftime`` table in the `Python 2 documentation `_. It is `there in the Python 3 docs `_, though.Q:
Did people really ask you these questions? I bet you just made them up for the FAQ.
A:
That's a very good question - it's one I've frequently asked myself, in fact.