即使 [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错误的代码。包含请求的错误消息如下所示。
此外,由于Django错误消息中含有环境变量,因此我们可以使用COOKIES进行split()并删除不必要的信息。
data = json.dumps(
{
"attachments": [{"color": "#e01d5a", "text": text}],
}
)
当您在Slack消息中添加注释后,消息旁边会出现红色线条,并且还能够折叠长消息,使其更易于阅读。有关详细信息,请参阅官方文档。
创建入站 Webhook
因为有一篇非常易懂的文章介绍了制作方法,所以我会把它分享给大家。
在创建Webhook之后,将环境变量写入.env文件中。
SLACK_ENDPOINT_URL=https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXX
让我们实际发送一下!
请提供更多上下文信息。