gpt4 book ai didi

django - 将生产错误发送到 slack 而不是电子邮件

转载 作者:行者123 更新时间:2023-12-04 17:47:16 26 4
gpt4 key购买 nike

我想让我的 Django 应用程序将调试信息发送到 slack,而不是通过电子邮件发送,这是默认设置。

  • 禁用电子邮件很简单。只是不要在 ADMINS 中放置任何电子邮件设置
  • 将信息发送到 slack 很容易。只需添加一个传入的 webhook

  • 现在,我应该在哪里创建发送消息的逻辑?中间件似乎是一个不错的主意。我会做类似的事情
    class ExceptionMiddleware:
    def process_exception(self, request, exception):
    pretty_debugging_message = ...
    requests.post("https://my-slack-url/", {...})

    中间件只会返回 None以免干扰系统的其余部分;毕竟,电子邮件已经被禁用。

    所以我的问题是:如何获得 django 收集的所有调试信息?我可以做类似的事情
    import sys, traceback
    pretty_debugging_message = '\n'.join(
    traceback.format_exception(*sys.exc_info())
    )

    但这仅提供了回溯。所有本地人、 session 、客户端 IP 等呢?

    通读 https://docs.djangoproject.com/en/1.8/howto/error-reporting/ ,我的想法是,直到处理了中间件之后才收集所有这些信息,也就是说,一旦尝试了一切,并且没有处理错误,Django 就会运行它的 ErrorReporter 并记录信息。我可以以某种方式干预该过程并使其将信息发送到 slack 吗?那会更好吗?

    更新

    我的解决方案:
    class SlackHandler(AdminEmailHandler):
    def emit(self, record):
    try:
    request = record.request
    subject = '%s (%s IP): %s' % (
    record.levelname,
    ('internal' if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS
    else 'EXTERNAL'),
    record.getMessage()
    )
    filter = get_exception_reporter_filter(request)
    request_repr = '\n{0}'.format(filter.get_request_repr(request))
    except Exception:
    subject = '%s: %s' % (
    record.levelname,
    record.getMessage()
    )
    request = None
    request_repr = "unavailable"
    subject = self.format_subject(subject)

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

    message = "%s\n\nRequest repr(): %s" % (self.format(record), request_repr)
    reporter = ExceptionReporter(request, is_email=True, *exc_info)
    html_message = reporter.get_traceback_html() if self.include_html else None

    requests.post(settings.SLACK_WEBHOOK_URL, json={
    "fallback": message,
    "pretext": "An error occured",
    "color": "#ef2a2a",
    "fields": [
    {
    "title": "Error",
    "value": message,
    "short": False
    }
    ]
    })

    在 settings.py 中:
    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
    'require_debug_false': {
    '()': 'django.utils.log.RequireDebugFalse'
    }
    },
    'handlers': {
    'slack': {
    'level': 'ERROR',
    'filters': ['require_debug_false'],
    'class': 'myapp.myapp.SlackHandler'
    }
    # 'mail_admins': {
    # 'level': 'ERROR',
    # 'filters': ['require_debug_false'],
    # 'class': 'django.utils.log.AdminEmailHandler'
    # }
    },
    'loggers': {
    'django.request': {
    'handlers': ['slack'],
    'level': 'ERROR',
    'propagate': True,
    },
    }
    }

    最佳答案

    我建议您创建一个自定义日志处理程序。你可以看看AdminEmailHandler实现并制作您自己的,或者甚至更简单,如果这适合您的需要,将其子类化并仅覆盖 send_mail方法。

    import requests

    from django.utils.log import AdminEmailHandler


    class SlackHandler(AdminEmailHandler):
    def send_mail(self, subject, message, *args, **kwargs):
    html_message = kwargs.get('html_message')
    requests.post("https://my-slack-url/", {...})

    然后您需要配置 LOGGING设置使用您的新处理程序而不是 AdminEmailHandler .这是 Django 的 default logging configuration .

    例子:
    'handlers': {
    'slack': {
    'level': 'ERROR',
    'filters': ['require_debug_false'],
    'class': 'import.path.to.SlackHandler'
    }
    },
    # ...
    'loggers': {
    'django.request': {
    'handlers': ['slack'],
    'level': 'ERROR',
    'propagate': False,
    },
    # ...
    }

    关于django - 将生产错误发送到 slack 而不是电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29914390/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com