Я создал специальный обработчик и модель для сохранения журналов в базе данных.
Следующая модель 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, и в системе не создаются записи:
Журналы не создаются
Если я использую ведение журнала обработчика файлов, журнал создается.