見出し画像

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

期待している効果

実際に問題のあるアプリケーションに組み込んで、暫く様子を見ます。

シリアル通信を扱うアプリなので、予期しない文字化けコードを受信したりするようならエラーの詳細で原因を確かめられると思います。

アプリが落ちてもエラーの詳細を取得出来ないようなら、それはそれで原因を切り分けられると期待しています。


今後とも宜しくお願い致します。





出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。