pylogctx icon indicating copy to clipboard operation
pylogctx copied to clipboard

:snake: Inject extra fields to each log records

| |GitHub| |BSD| |CI| |PyPI|

######################## Python Logging Context ########################

pylogctx is a library for enriching each logs records from a context. Typical usage is for adding some request_id to all logs in order to make troubleshooting more comfortable. This context is shared by all piece of code using logging, transparently.

.. code-block::

import logging.config

from pylogctx import context as log_context


logging.config.dictConfig({
    'formatters': {'json': {
        '()': 'pythonjsonlogger.jsonlogger.JsonFormatter',
        'format': "%(asctime)s %(name)s %(levelname)s %(message)s",
    }},
    'filters': {'context': {
        '()': 'pylogctx.AddContextFilter',
    }},
    'handlers': {'console': {
        'class': 'logging.StreamHandler',
        'filters': ['context'],
        'formatter': 'json',
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['console'],
    },
})


logger = logging.getLogger(__name__)


def mycode(request, ticket_id):
    # push new fields
    log_context.update(requestId=uuid.uuid4())
    myticket = get_object_or_404(models.Ticket, pk=ticket_id)

    # push objects, they will be adapted to log fields
    log_context.update(myticket):

    # Log as usual
    logger.info("Working on %r", myticket)

    for comment in myticket.comments:
        # A context manager allow to push and pop fields
        with log_context(comment):
            logger.info("Working on comment %r", comment)
            # code, use external libs, etc.

    # Don't forget to clear the context for the next request. Use the
    # middleware to have it clean.
    log_context.clear()

The output looks like::

 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on <Ticket #1>', 'ticketId': 1, 'requestId': 'c5521138-031a-4da6-b9db-c9eda3e090f1'}
 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on comment <Comment #4>', 'ticketId': 1, 'ticketCommentId': 4, 'requestId': 'c5521138-031a-4da6-b9db-c9eda3e090f1'}
 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on comment <Comment #5>', 'ticketId': 1, 'ticketCommentId': 5, 'requestId': 'c5521138-031a-4da6-b9db-c9eda3e090f1'}
 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on comment <Comment #78>', 'ticketId': 1, 'ticketCommentId': 78, 'requestId': 'c5521138-031a-4da6-b9db-c9eda3e090f1'}
 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on comment <Comment #9>', 'ticketId': 1, 'ticketCommentId': 9, 'requestId': 'c5521138-031a-4da6-b9db-c9eda3e090f1'}
 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on <Ticket #890>', 'ticketId': 890, 'requestId': 'c64aaae7-049b-4a02-929b-2d0ac9141f5c'}
 {'loggerName': 'package.module', 'levelname': 'INFO', 'message': 'Working on comment <Comment #80>', 'ticketId': 890, 'ticketCommentId': 80, 'requestId': 'c64aaae7-049b-4a02-929b-2d0ac9141f5c'}

Install it with your favorite python package installer::

$ pip install pylogctx

There is a few helpers for Celery_ and Django_ projects. See USAGE_ for details!

Contributors

Join us to make log rocking better! Read HACKING_ and ask maintainers:

  • David STEINBERGER @dsteinberger <https://github.com/dsteinberger>_
  • Étienne BERSAC @bersace <https://github.com/bersace>_
  • Lev Orekhov @lorehov <https://github.com/lorehov>_
  • Malte Baden Hansen @Moulde <https://github.com/Moulde>_
  • Vincent RIALLAND @vrialland <https://github.com/vrialland>_
  • Hugo SMETT @hsmett <https://github.com/hsmett>_

.. |BSD| image:: https://img.shields.io/pypi/l/pylogctx.svg?maxAge=2592000 :target: https://github.com/novafloss/pylogctx/blob/master/LICENSE :alt: BSD Licensed

.. |CI| image:: https://travis-ci.org/peopledoc/pylogctx.svg?style=shield :target: https://travis-ci.org/peopledoc/pylogctx :alt: CI Status

.. |GitHub| image:: https://img.shields.io/github/stars/novafloss/pylogctx.svg?label=GitHub%20stars :target: https://github.com/novafloss/pylogctx :alt: GitHub homepage

.. |PyPI| image:: https://img.shields.io/pypi/v/pylogctx.svg :target: https://pypi.python.org/pypi/pylogctx :alt: Version on PyPI

.. _Celery: http://www.celeryproject.org/ .. _Django: https://www.djangoproject.com/ .. _HACKING: https://github.com/novafloss/pylogctx/blob/master/HACKING.rst .. _USAGE: https://github.com/novafloss/pylogctx/blob/master/USAGE.rst