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

2024-06-07 18:09:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下模型日志项在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])

我已经在我的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}"
                )

在自定义DBhandler中不会触发pdb.set_trace(),并且在系统中不会生成任何条目:

No logs are generated

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


Tags: namepyimportselflogmodelmodelshandlers
1条回答
网友
1楼 · 发布于 2024-06-07 18:09:38

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

相关问题 更多 >

    热门问题