sh-cho/django-custom-logging


Django middleware for custom format logging 🪵

License: MIT

Language: Python

Keywords: django, django-rest-framework, logging, middleware, python


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 Statistics

Sourcerank 5
Repository Size 50.8 KB
Stars 4
Forks 1
Watchers 2
Open issues 1
Dependencies 0
Contributors 2
Tags 12
Created
Last updated
Last pushed

Top Contributors See all

Seonghyeon Cho Ashiq Hussain Kumar

Packages Referencing this Repo

django-custom-logging
Django middleware for custom format logging
Latest release 0.2.1 - Updated - 4 stars

Recent Tags See all

v0.2.1 March 02, 2024
v0.2.0 March 01, 2024
v0.1.1 September 06, 2021
v0.1.0 April 03, 2021
v0.0.1-beta.7 April 03, 2021
v0.0.1-beta7 April 03, 2021
v0.0.1-beta.6 March 28, 2021
v0.0.1-beta.5 March 28, 2021
v0.0.1-beta.4 March 28, 2021
v0.0.1-beta.3 March 26, 2021
v0.0.1-beta.2 March 26, 2021
v0.0.1-beta.1 March 26, 2021

Something wrong with this page? Make a suggestion

Last synced: 2024-03-02 07:26:55 UTC

Login to resync this repository