Skip to main content

Django middleware for custom format logging

Project description

django-custom-logging django-custom-logging logo

django middleware for custom format logging

PyPI PyPI - License PyPI - Python Version PyPI - Downloads PyPI - Wheel Test Lint Code style: black

Installation

  1. Install the package
python -m pip install django-custom-logging
  1. Add adequate middlewares to MIDDLEWARE in setting file. Current version only supports a middleware that captures request into local thread(threading.local())
MIDDLEWARE = (
    # other middlewares ...
    "custom_logging.middlewares.capture_request",
)
  1. Add custom_logging.filters.CustomFilter to LOGGING in setting file and set capture_list containing a list of variables to be captured(capture_in) and format string to be printed(capture_out). Also add filter on handler's filter list.
LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{levelname} {asctime} {module} {meta[REMOTE_ADDR]} {meta[CONTENT_LENGTH]} {process:d} {thread:d}"
                      " [USER_ID:{user_id}] {message}",
                                #^^^^^^^^^ - (A)
            "style": "{",
        },
    },
    "filters": {
        "custom_filter": {
        #^^^^^^^^^^^^^ - (B)
            "()": "custom_logging.filters.CustomFilter",
            "capture_list": (
                # (capture_in, capture_out)
                ("request.user.id", "user_id"),
                                    #^^^^^^^ - (A)
                ("request.META", "meta"),
            ),
            "default_values" : {
                "meta": {
                    "REMOTE_ADDR": "127.0.0.1",
                    "CONTENT_LENGTH": 0,
                }
            },
        },
    },
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "verbose",
            "filters": ["custom_filter"],
                        #^^^^^^^^^^^^^ - (B)
        },
    },
    "root": {"level": "INFO", "handlers": ["console"]},
}

Note that you can use any format styles(%, {, $), but should make format arguments with str type. For example, if you want to capture request.user.id as user_id, please follow format below.

%-style: %(user_id)s
{-style: {user_id}
$-style: ${user_id}

⚠️ Specifying Default Values

Default values should be provided if capture_out is object and its attribute can be undefined. (ex. {meta[REMOTE_ADDR]})

For example, accessing request variable in filter while using scheduling cronjob(ex. @shared_task) can raise error because it is not HTTP request so request is not defined.

If capture_out is single value(ex. str, int, etc.), default value is not needed. It will be replaced with placeholder - if it is not defined.

How to use

You can use logger just like before. No extra parameter is needed.

import logging

from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

logger = logging.getLogger(__name__)


class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)

    def post(self, request, format=None):
        logger.info("example log")
        return Response({"hello": "world!"}, status=status.HTTP_200_OK)
INFO 2024-03-01 11:33:25,170 credentials 127.0.0.1 0 35052 4748750336 [USER_ID:-] Found credentials in shared credentials file: ~/.aws/credentials
INFO 2024-03-01 11:33:25,505 views 123.123.123.123 1000 35052 4748750336 [USER_ID:33] example log

Supported versions

  • Python: >=3.5
  • Django: >=3

License

See LICENSE

Contribution

Feel free to open issue or pull request.

Contributors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_custom_logging-0.2.1.tar.gz (5.8 kB view hashes)

Uploaded Source

Built Distribution

django_custom_logging-0.2.1-py3-none-any.whl (6.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page