自定义记录器未在Django中发出日志

时间:2020-08-07 08:24:08

标签: python django logging

我创建了一个自定义处理程序和一个模型来将日志保存到数据库中。

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中触发,并且系统中不会生成任何条目:

No logs are generated

如果我使用文件处理程序日志记录,则会生成日志。

1 个答案:

答案 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,},
    },
}