
PythonでエラーをSlackに通知
この記事の後で修正した記事がありますので、そちらもご覧ください。
作ったアプリが稀に落ちる事例が発生し、原因を見付けられずに居ました。
そこで、traceback を使ってエラーの詳細を Slack の指定チャンネルに通知することにしました。
Slack の bot を作って認証し、token を取得してから bot を指定チャンネルのメンバーに加える作業は割愛します。調べるとスクリーンショットを並べて丁寧に説明している記事が複数ありますので、そちらをご覧下さい。
この記事の後にプログラムを修正しています。続編「PythonでエラーをSlackに通知」をご覧ください。
ソースコード
必要なコードを書いて動作確認したものです。
予期せずエラーが発生するとエラーの詳細をprint し、自機のIPアドレスとエラーの詳細を Slack の指定チャンネルに通知します。
import requests # class SlackDriver で使用
# ********** Trace Report Start *************************************************
class SlackDriver:
def __init__(self, _token):
self._token = _token # api_token
self._headers = {"Authorization" : "Bearer "+ _token}
def send_message(self, message, channel):
params = {"channel": channel, "text": message}
r = requests.post('https://slack.com/api/chat.postMessage',
headers=self._headers,
params=params)
#print("return ", r.json())
def tracereport(): # Trace Reort (Slack & OS console)
#import requests # ソースの先頭で宣言しないと機能しない
import traceback # 他の関数も使う場合はソースの先頭で宣言
import socket # 他の関数も使う場合はソースの先頭で宣言
token = '<<< あなたのトークン >>>' # token.
slack = SlackDriver(token)
host = socket.gethostname() # ホスト名取得
ip = socket.gethostbyname(host) # ホストのIPを取得
lst = traceback.format_exc() # エラー情報を取得
print(lst)
slack.send_message(ip + '\r\n' + lst, "<<< #で始まるチャンネル名 >>>")
# ********** Trace Report End *************************************************
def main():
try:
a = 1 / 0
except:
tracereport() # Trace Reort (Slack & OS console)
if __name__ == '__main__':
main()
main() では a = 1 / 0 を実行してエラーを発生させています。
実行結果
Slack の指定チャンネルには以下のメッセージが届きます。
print() されるのは先頭行のIPアドレス無しのメッセージです。
192.168.xx.yyy
Traceback (most recent call last):
File "<module1>", line 49, in main
ZeroDivisionError: division by zero
期待している効果
実際に問題のあるアプリケーションに組み込んで、暫く様子を見ます。
シリアル通信を扱うアプリなので、予期しない文字化けコードを受信したりするようならエラーの詳細で原因を確かめられると思います。
アプリが落ちてもエラーの詳細を取得出来ないようなら、それはそれで原因を切り分けられると期待しています。
今後とも宜しくお願い致します。
いいなと思ったら応援しよう!
