LoginSignup
8
8

More than 5 years have passed since last update.

django-slackを試してみた

Last updated at Posted at 2017-04-05

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

以上!

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8