【问题标题】:Log not emitted in Django from custom logger自定义记录器未在 Django 中发出日志
【发布时间】:2020-08-07 08:24:08
【问题描述】:

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

apploggermodels.py中定义了以下模型LogEntry:

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])

我在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 中触发,系统中也没有生成条目:

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

【问题讨论】:

    标签: python django logging


    【解决方案1】:

    我想通了。 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,},
        },
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 2019-11-15
      相关资源
      最近更新 更多