pythonのloggingでslackに通知させる
サービスの運用監視はみなさんどのように行っていますか?
nagiosやzabbixのようなツールあるけど、設定面倒だし、もっと気軽にやりたい。 pythonerの自分的にはloggingでログを落とすのと同時にアラート通知もやりたい。 さらに言えば、slackのサービス運用用チャンネルにアラート通知した。
というわけで、loggingのslackハンドラーを作りました。
使い方
Slack Web API の token を取得
今回はとりあえずテストトークンで試してみましょう。
ブラウザでSlackに一度ログインし、Slack Web API | Slack にアクセスする。
「Generate test tokens」をクリック。
「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通知
ファイルログ
$ 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通知は投稿時刻からもわかるように即座に通知されています。