Журнал не создается в Django из пользовательского регистратора - PullRequest
1 голос
/ 07 августа 2020

Я создал специальный обработчик и модель для сохранения журналов в базе данных.

Следующая модель LogEntry определена в applogger в models.py:

from django.db import models

class LogEntry(models.Model):
    time = models.DateTimeField(auto_now_add=True)
    level = models.CharField(max_length=10)
    message = models.TextField()

У меня есть приложение под названием applogger с обработчиком журнала handlers.py:

from logging import Handler

import json, datetime, random


class DBHandler(Handler):
    model_name = None
    expiry = None

    def __init__(self, model="", expiry=0):
        super(DBHandler,self).__init__()
        self.model_name = model
        self.expiry = int(expiry)

    def emit(self, record):
        # putting a pdb trace
        # this is not triggered
        import pdb; pdb.set_trace()
        try:
            # instantiate the model
            try:
                model = self.get_model(self.model_name)
            except:
                from .models import LogEntry as model

            log_entry = model(level=record.levelname, message=self.format(record))

            except:
                pass

            log_entry.save()

        except:
            pass

    def get_model(self, name):
        names = name.split('.')
        mod = __import__('.'.join(names[:-1]), fromlist=names[-1:])
        return getattr(mod, names[-1])

Я установил следующую конфигурацию LOGGING в моем settings.py

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{levelname} {asctime} {module} {process:d} {thread:d} {message}",
            "style": "{",
        },
    },
    "handlers": {
        "log_db": {
            "level": "INFO",
            "class": "applogger.handlers.DBHandler",
            "model": "applogger.models.LogEntry",
            "expiry": 86400,
            "formatter": "verbose",
        },
    },
    "logger": {
        "api": {                  # I have tried "django" and "api.views" both don't work here
            "handlers": ["log_db"], 
            "level": "INFO",
        }
    },
}

In api У меня есть views.py, в котором я инициализировал регистратор следующим образом:

import logging

# instance of the logger
logger = logging.getLogger(__name__)
logger.info('View Initialized')


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

    def post(self, request, *args, **kwargs):
            ...
            ...
            # business logic
            if file_object.created_by == request.user:
                file_object.save()
                logger.info(
                    f"REQUEST USER: {request.user}"
                )

pdb.set_trace() не запускается в пользовательском обработчике DB, и в системе не создаются записи:

Журналы не создаются

Если я использую ведение журнала обработчика файлов, журнал создается.

1 Ответ

2 голосов
/ 07 августа 2020

Я разобрался. Фреймворк Django требует, чтобы словарь имел 'loggers', и я настроил его с помощью 'logger'. ?‍♂️

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "formatters": {
        "verbose": {
            "format": "{levelname} {asctime} {module} {process:d} {thread:d} {message}",
            "style": "{",
        },
    },
    "handlers": {
        "file": {
            "level": "DEBUG",
            "class": "applogger.handlers.DBHandler",
            "model": "applogger.models.LogEntry",
            "expiry": 86400,
            "formatter": "verbose",
        },
    },
    "loggers": { 
        "sdpapi": {"handlers": ["file"], "level": "DEBUG", "propagate": True,},
    },
}
...