Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

django-slackを試してみた

More than 3 years have passed since last update.

Djangoでエラー発生したらslackに通知するのにお手軽なライブラリないかなーってぐぐってたら引っかかったので使ってみた。
最終的にはログはFluentdで集約して通知もやろうと思っているけど、今は開発中だけど社内には公開している状況でさっと実装できるなら当面はこれでしのごうかなっていう感覚での導入です。

django-slackとは

↓django-slackってのはこいつ。
http://django-slack.readthedocs.io/

なにができるのか

ざっくりいうと下記の2つ。

  1. slack_message()でslackにメッセージを投稿できる。
    http://django-slack.readthedocs.io/#richly-formatted-messages
  2. 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_SILENTLYTrueにするとエラーが表示されるようになります。

バージョン

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なるものも用意されているみたいなのでそっちで非同期処理にしたほうが良さそう。

以上!

hfujima
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away