pythonのloggingでslackに通知させる

サービスの運用監視はみなさんどのように行っていますか?

nagiosやzabbixのようなツールあるけど、設定面倒だし、もっと気軽にやりたい。 pythonerの自分的にはloggingでログを落とすのと同時にアラート通知もやりたい。 さらに言えば、slackのサービス運用用チャンネルにアラート通知した。

というわけで、loggingのslackハンドラーを作りました。

github.com

使い方

Slack Web API の token を取得

今回はとりあえずテストトークンで試してみましょう。

ブラウザでSlackに一度ログインし、Slack Web API | Slack にアクセスする。

f:id:clara_1130:20170122232520p:plain

「Generate test tokens」をクリック。

f:id:clara_1130:20170122233517p:plain

「Create token」をクリック。テストトークンを取得することができます。

SlackHandler をインストール&テスト実行

githubからpipでインストール

pip install git+https://github.com/ShigekiYoshioka/SlackHandler

下記のように実装し、

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
from logging.handlers import TimedRotatingFileHandler

from SlackHandler import SlackHandler

logging.basicConfig(level=logging.INFO)

fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
datefmt = "%Y/%m/%d %H:%M:%S"
formatter = logging.Formatter(fmt=fmt, datefmt=datefmt)

slack_handler = SlackHandler(
    host='slack.com',
    url='/api/chat.postMessage',
    token="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", # ここにテストトークンを入れる。
    channel="#general",  # アラートを飛ばすチャンネル
    username="slack_handler" # アラートを飛ばすユーザ名
)
slack_handler.setFormatter(fmt=formatter)
slack_handler.setLevel(logging.ERROR) # slack通知はあくまでアラートなのでERROR以上で良いでしょう。

# ファイルログも残します。
timed_rotating_file_handler = TimedRotatingFileHandler(
    filename='logger.log',
    when='D',
    backupCount=7
)

timed_rotating_file_handler.setFormatter(fmt=formatter)
timed_rotating_file_handler.setLevel(logging.INFO) # ファイルログはINFO以上のログを残し、何かあったときに追えるようにしましょう。

logger = logging.getLogger('logger')
logger.addHandler(slack_handler)
logger.addHandler(timed_rotating_file_handler)

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

実行。

$ python slackHandlerTest.py
INFO:logger:info
WARNING:logger:warning
ERROR:logger:error
CRITICAL:logger:critical

ログの確認

Slack通知

f:id:clara_1130:20170122234716p:plain

ファイルログ

$ cat logger.log
2017/01/22 23:45:54 - logger - INFO - info
2017/01/22 23:45:54 - logger - WARNING - warning
2017/01/22 23:45:54 - logger - ERROR - error
2017/01/22 23:45:54 - logger - CRITICAL - critical

ERROR以上のログがSlackに、INFO以上のログがファイルログに残っています。当たり前ですがSlack通知は投稿時刻からもわかるように即座に通知されています。