【问题标题】:Custom logger is not being triggered when DEBUG=False当 DEBUG=False 时不会触发自定义记录器
【发布时间】:2019-04-18 14:00:09
【问题描述】:

我在settings.py 中有以下代码:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', },
    },
    'handlers': {
        'console': {
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        },
        'kodular': {
            'level': 'WARNING',
            'class': 'account.reporter.KodularExceptionHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console', 'kodular'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
        },
    },
}

KodularExceptionHandler 类如下所示:

from copy import copy
import json
import logging
import requests

from django.conf import settings
from django.utils.log import AdminEmailHandler
from django.views.debug import ExceptionReporter

class KodularExceptionHandler(AdminEmailHandler):
    def emit(self, record, *args, **kwargs):
        print("Triggered")
        try:
            request = record.request
            subject = record.getMessage()
        except Exception:
            return

        if record.exc_info:
            exc_info = record.exc_info
        else:
            exc_info = (None, record.getMessage(), None)

        reporter = ExceptionReporter(request, is_email=True, *exc_info)
        message = "%s\n\n%s" % (self.format(copy(record)), reporter.get_traceback_text())

        text = "**Error Level**: *%s* | **Status Code**: `%s`\n\n\n" % (record.levelname, record.status_code)

        url = 'https://api.github.com/repos/'+settings.GITHUB_ORG+'/'+settings.GITHUB_REPO+'/issues'
        session = requests.Session()
        session.auth = (settings.GITHUB_USERNAME, settings.GITHUB_PASSWORD)
        issue = {'title': subject,
                'body': text+message.replace('*', '\*').replace('_', '\_'),
                'labels': ["error"]}
        r = session.post(url, json.dumps(issue))
        if r.status_code != 201:
            return
        github_issue_url = json.loads(r.content)['html_url']



        if record.levelname == "WARNING":
            return

        attachments =  [{
            'title': subject,
            'color': 'danger',
            'actions': [{
                'type': 'button',
                'text': 'Github Issue',
                'url': github_issue_url,
                'style': 'primary',
            }],
            'fields': [{
                "title": "Level",
                "value": record.levelname,
                "short": True
            },{
                "title": "Method",
                "value": request.method if request else 'No Request',
                "short": True
            },{
                "title": "Path",
                "value": request.path if request else 'No Request',
                "short": True
            },{
                "title": "User",
                "value": ( (request.user.username + ' (' + str(request.user.pk) + ')'
                        if request.user.is_authenticated else 'Anonymous' )
                        if request else 'No Request' ),
                "short": True
            },{
                "title": "Status Code",
                "value": record.status_code,
                "short": True
            },{
                "title": "UA",
                "value": ( request.META['HTTP_USER_AGENT']
                        if request and request.META else 'No Request' ),
                "short": False
            },{
                "title": 'GET Params',
                "value": json.dumps(request.GET) if request else 'No Request',
                "short": False
            },{
                "title": "POST Data",
                "value": json.dumps(request.POST) if request else 'No Request',
                "short": False
            }]
        }]

        data = { 'payload': json.dumps({'attachments': attachments}) }
        webhook_url = settings.SLACK_HOOK
        r = requests.post(webhook_url, data=data)

当我在设置中设置 DEBUG = True 时,一切正常:控制台处理错误(并打印“到达”),创建 Github 问题并发送 Slack 通知。

 

但是,如果我设置DEBUG = False,就会出错。正如预期的那样,控制台输出的信息更少;但既没有创建 Github 问题,也没有发送 Slack 通知。

我认为记录器处理程序的某个地方存在问题。看起来KodularExceptionHandler 没有被触发,因为控制台没有打印“到达”,而当启用调试时它会打印。

知道当调试设置为 false 时自定义错误报告类没有被触发的原因是什么?

【问题讨论】:

    标签: python django django-logging


    【解决方案1】:

    这是因为这是AdminEmailHandler 的默认行为(在配置中定义),它是KodularExceptionHandler 类的父类。由于 AdminEmailHandler 类在加载 django 应用程序时启用了 django.utils.log.RequireDebugFalse 过滤器 (https://github.com/django/django/blob/stable/2.2.x/django/utils/log.py#L49),因此此过滤器扩展到从处理程序继承的任何类。

    您可以使用设置'disable_existing_loggers': True,或者根本不继承AdminEmailHandler。如果您查看AdminEmailHandler (https://github.com/django/django/blob/stable/2.2.x/django/utils/log.py#L79) 的代码,您会注意到您已经覆盖了它的大部分代码(__init__ 除外)。也许你可以从logging.Handler 继承。

    【讨论】:

    • 我知道,但问题是它以另一种方式工作。仅在 DEBUG=True 时有效
    • @DiegoBarreiro 你自相矛盾。在您的问题中,您说它在 DEBUG=False 时有效:“当我在设置中设置 DEBUG = False 时,一切正常”
    • @dirkgroten 是的,对不起,我现在意识到......我把问题搞砸了,我现在已经编辑了。我能够解决这个问题,我的自定义视图有问题;我现在就写答案。
    【解决方案2】:

    我的urls.py 文件有一个小问题。我正在使用自定义错误页面处理程序:

    from account import views
    
    handler404 = views.error404
    handler500 = views.error500
    

    但是,views.py 文件看起来像这样:

    from django.shortcuts import render
    
    from account.admin import requires_login
    
    def error404(request, *args, **kwargs):
        return render(request, 'error/404.html')
    
    def error500(request, *args, **kwargs):
        return render(request, 'error/500.html')
    

    我把所有东西都改成了

    from django.shortcuts import render
    
    from account.admin import requires_login
    
    def error404(request, *args, **kwargs):
        return render(request, 'error/404.html', status=404)
    
    def error500(request, *args, **kwargs):
        return render(request, 'error/500.html', status=500)
    

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 2013-03-25
      • 1970-01-01
      • 2011-03-06
      • 2013-12-03
      • 2015-02-13
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多