即使 [Django] 调试模式为 False,也可以通过 Slack 发送错误日志!

简述

在生产环境中将Django的Debug=False设置后,当遇到500错误时,不会再显示日志信息,这是一件好事,但也会使错误的定位变得困难。因此,我将解释如何实现在发生500错误时将错误消息发送到Slack的方法。

前提 tí)

    loggerについてある程度知っている

目錄結構

tree
.
├── project
│   ├── __init__.py
│   ├── __pycache__
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── application
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── utils
    │   └── logs.py   
    └── views

日志配置

由於要進行日誌設定,我們將逐一進行解釋。Django使用dicConfig格式,利用字典進行日誌設定。

筛选器

由于本次需在Debug=False的情况下发送错误日志,因此在filters中添加。

require_debug_false

设置

从手动控制者转变为处理程序

這次我們將使用一個名為 SlackHandler 的自定義處理器類別,該類別繼承自 AdminEmailHandler。透過繼承 AdminEmailHandler,我們將使用 SlackHandler 處理所有高於 ERROR 等級的訊息。

伐木工人

可以通过在django.request中指定”level”: “ERROR”来将ERROR及以上级别的日志传递给特定的处理程序(如SlackHandler)。

LOGGING = {
    "version": 1,
    "disable_existing_loggers": False,
    "filters": {
        "require_debug_false": {
            "()": "django.utils.log.RequireDebugFalse",
        },
    },
    "handlers": {
        "slack": {
            "level": "ERROR",
            "filters": ["require_debug_false"],
            "class": "application.utils.logs.SlackHandler",
        }
    },
    "loggers": {
        "django.request": {
            "handlers": ["slack"],
            "level": "ERROR",
            "propagate": True,
        },
    },
}

# DEBUG=Falseの時に環境変数としてincomming webhookのurlを取得
if not DEBUG:
    SLACK_ENDPOINT_URL = os.environ.get("SLACK_ENDPOINT_URL")

设定的详细信息已在官方文件中提及。

 

设置Slack通知

我們要進行Slack通知的設定。由於這次想要使用Slack的API來發送訊息,所以我們會安裝requests。

pip install requests
import json

import requests
from django.utils.log import AdminEmailHandler

from project import settings


class SlackHandler(AdminEmailHandler):
    def send_mail(self, subject, message, *args, **kwargs):
        webhook_url = settings.SLACK_ENDPOINT_URL
        if "Request" in message:
            alarm_emoji = ":rotating_light:"
            text = alarm_emoji + message.split("COOKIES")[0]
            data = json.dumps(
                {
                    "attachments": [{"color": "#e01d5a", "text": text}],
                }
            )
            headers = {"Content-Type": "application/json"}
            requests.post(url=webhook_url, data=data, headers=headers)

下面是按顺序进行解释。
这次我们将在send_mail方法内部编写向slack发送消息的处理。
调用此方法的时机是

    • 500エラーをハンドリングする時

 

    500エラーを出した際のhtmlを出力する時

只在有两个错误且包含请求的情况下执行处理500错误的代码。包含请求的错误消息如下所示。

スクリーンショット 2023-09-08 19.41.06.png

此外,由于Django错误消息中含有环境变量,因此我们可以使用COOKIES进行split()并删除不必要的信息。

data = json.dumps(
    {
        "attachments": [{"color": "#e01d5a", "text": text}],
    }
)

当您在Slack消息中添加注释后,消息旁边会出现红色线条,并且还能够折叠长消息,使其更易于阅读。有关详细信息,请参阅官方文档。

 

创建入站 Webhook

因为有一篇非常易懂的文章介绍了制作方法,所以我会把它分享给大家。

 

在创建Webhook之后,将环境变量写入.env文件中。

SLACK_ENDPOINT_URL=https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXX

让我们实际发送一下!

スクリーンショット 2023-09-08 19.47.46.png
スクリーンショット 2023-09-08 19.49.33.png

请提供更多上下文信息。

 

广告
将在 10 秒后关闭
bannerAds