Djangoでエラー発生したらslackに通知するのにお手軽なライブラリないかなーってぐぐってたら引っかかったので使ってみた。
最終的にはログはFluentdで集約して通知もやろうと思っているけど、今は開発中だけど社内には公開している状況でさっと実装できるなら当面はこれでしのごうかなっていう感覚での導入です。
django-slackとは
↓django-slackってのはこいつ。
http://django-slack.readthedocs.io/
なにができるのか
ざっくりいうと下記の2つ。
- slack_message()でslackにメッセージを投稿できる。
http://django-slack.readthedocs.io/#richly-formatted-messages - Exceptionが発生したらslackにメッセージを投稿する。
http://django-slack.readthedocs.io/#logging-exceptions-to-slack
で、今回は後者のために使ってみる。
準備
slackに投稿するためのtokenを取得しておく。
test token使うかちゃんとbotsの設定するのかは個々のお好きにどうぞ。
https://api.slack.com/custom-integrations/legacy-tokens
https://slack.com/apps/A0F7YS25R-bots
install
pip install django-slack
実装
settingsを変更するだけ。
INSTALLED_APPSの追加
INSTALLED_APPSにdjango_slack
を追加
INSTALLED_APPS = [
# ... some apps
'django_slack',
]
loggerの設定
SlackExceptionHandlerを追加してdjango loggerのhandlersに追加する。
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
},
'handlers': {
'slack_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django_slack.log.SlackExceptionHandler',
},
},
'loggers': {
'django': {
'level': 'ERROR',
'handlers': ['slack_admins'],
},
},
}
※ローカルの開発環境とかDBUG=Trueの環境のエラーはslackに流したくないのでrequire_debug_false
をfiltersに設定しておく。
オプションの設定
tokenとかをオプションで指定する。
SLACK_TOKEN = 'SOME_TOKEN'
SLACK_CHANNEL = '#PUBLIC_CHANNEL'
SLACK_USERNAME = 'USER-NAME'
SLACK_ICON_EMOJI = ':bangbang:'
SLACK_FAIL_SILENTLY = True
SLACK_FAIL_SILENTLY
をFalseにするとchannelの指定を間違えたりしてSlackExceptionHandler
内でエラーが発生すると「エラー発生」→「slackに通知しなくちゃ」→「エラー発生」→「slackに通知しなくちゃ」といった具合に無限ループに陥ります。
他のオプションは下記参照。
http://django-slack.readthedocs.io/#configuration
疎通確認
python manage.py shell
で以下を実行する。
from django_slack import slack_message
slack_message('django_slack/exception.slack', {'text': 'hoge'})
指定のchannelに'hoge'と投稿されれば成功です。
ちなみにDEBUG=Trueの環境で疎通確認する場合はSLACK_BACKEND = 'django_slack.backends.UrllibBackend'
を追加してください。
疎通確認に失敗した場合はSLACK_FAIL_SILENTLY
をTrue
にするとエラーが表示されるようになります。
バージョン
Django==1.11
django-slack==5.8.0
感想
簡単に使えるのはいいね。
ただSLACK_FAIL_SILENTLY
をTrueにしたら本当に黙ってしまうのだけどせめてlogger('django_slack')でlog吐くようにして欲しいよね。
https://github.com/lamby/django-slack/blob/24ce48de96f561518e81aa3adef89c4f5f287707/django_slack/api.py#L132
基本的には本番環境で使うことはないと思うけど本番環境で使う場合はCeleryBackendなるものも用意されているみたいなのでそっちで非同期処理にしたほうが良さそう。
以上!