我创建了一个自定义处理程序和一个模型来将日志保存到数据库中。
在applogger
的{{1}}中定义了以下模型LogEntry:
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",
}
},
}
应用程序中,我有一个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}"
)
不会在定制DBhandler中触发,并且系统中不会生成任何条目:
如果我使用文件处理程序日志记录,则会生成日志。
答案 0 :(得分:2)
我知道了。 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,},
},
}