Python 日志未在Django中从自定义记录器发出
我已经创建了一个自定义处理程序和一个模型来将日志保存到数据库中 以下模型日志条目在Python 日志未在Django中从自定义记录器发出,python,django,logging,Python,Django,Logging,我已经创建了一个自定义处理程序和一个模型来将日志保存到数据库中 以下模型日志条目在models.py的applogger中定义: 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
models.py的applogger
中定义:
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()
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])
我有一个名为applogger
的应用程序,其中有一个日志处理程序handlers.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()
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])
我已在我的settings.py中设置了以下LOGGING
配置
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}"
)
pdb.set_trace()
不会在自定义DBhandler中触发,并且不会在系统中生成任何条目:
如果我使用文件处理程序日志记录,则会生成日志。我找到了它。Django框架要求字典具有'logger'
,我用'logger'
对其进行了配置。