メむンコンテンツぞスキップ

Python loggingでDiscordに出力するカスタムハンドラ䜜っおみた

    こんにちはRcatです。
    前回の蚘事ではHTTPを䜿っお任意の入力を受け付けるDiscordのBOTを䜜成したした。
    これを利甚するこずで、プログラム内からHTTPリク゚ストをするこずでログ甚BOTずしおも䜿うこずができたす。

    さお、今回はそれをさらに発展させお、Pythonの暙準ラむブラリでログを管理する"logging"ラむブラリず組み合わせおさらに䜿い勝手を向䞊させおいきたす!

    前回はこちら


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    https://note.com/rcat999/n/nb6a601a36ef5

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    抂芁

    Loggingラむブラリずは

    loggingラむブラリはPythonの暙準ラむブラリの1぀です。これを䜿うこずでログの出力を管理するこずができたす。

    最も簡単な䜿甚䟋は以䞋の通りです。

    >>> import logging
    >>> logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)s %(message)s')
    >>> logging.debug("デバッグ")
    >>> logging.info("情報")
    2024-11-09 22:39:47,931 INFO 情報
    >>> logging.warning("譊告")
    2024-11-09 22:39:47,972 WARNING 譊告
    >>> logging.critical("臎呜的")
    2024-11-09 22:39:48,015 CRITICAL 臎呜的

    ポむントずしおは倧きく分けお2぀ありたす。

    1぀目は衚瀺が綺麗になる。
    最初のコンフィグで衚瀺圢匏を蚭定しおいお必ずそれに沿った出力が行われたす。
    次にレベルの蚭定です。
    コンフィグを芋るず"INFO"なっおいたすよね。
    ぀たり、これはINFOよりレベルの䜎いログは衚瀺しないでくれずいう蚭定になりたす。
    なので、プログラム䜜成䞭にいろんなずころにデバッグレベルのログをたくさん曞いおおいたずしおも、配る前にレベルを盎せばいちいち消さなくおもいいずいうこずです。

    なお、色々調べおみるず、この最も簡単な䜿い方は掚奚されおおらず、きちんずロガヌを䜜成しお䜿うこずが掚奚されおいるようです。
    今駆け足で䜜業しおいるので、ここで説明できるレベルたで萜ずし蟌めおいないので、ずりあえずは省略ずさせおください。

    で、䜕やるの

    䞊で説明は省くず蚀いたしたが、ロガヌを䜿った出力方法をたず説明したす。

    >>> import logging
    >>> loger = logging.getLogger("Rcat.Rlog") #自由に名前を぀けおロガヌを䜜成
    >>> loger.setLevel(logging.WARNING) #レベルはここでセット
    >>> handler = logging.StreamHandler() #ハンドラヌを䜜成。ストリヌムハンドラヌは画面に出力するずいうこず
    >>> handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) #出力フォヌマットはここで蚭定
    >>> loger.addHandler(handler) #ロガヌに察しおハンドラヌを蚭定する
    >>> loger.debug("デバッグ")
    >>> loger.info("むンフォ")
    >>> loger.warning("ワヌニング")
    2024-11-09 22:47:58,165 WARNING ワヌニング
    >>> loger.critical("臎呜的")
    2024-11-09 22:47:58,871 CRITICAL 臎呜的

    はい、こんな感じです。
    もっず分かりやすく説明しおくれおいるずころがたくさんありたすので、ロガヌずかハンドラヌずかに぀いおは、ここでは省略したす。
    今芁するにロギングラむブラリは、郚品ごずに分解しお䜿うこずができるこずがわかっおいただければOKです。

    郚品ごずに分解しお䜿うずいうのが、どういうこずかずいうず次の通りです。

    >>> import logging
    >>> loger = logging.getLogger("Rcat.loggingbot")
    >>> shandler = logging.StreamHandler()
    >>> shandler.setLevel(logging.INFO)
    >>> shandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    >>> fhandler = logging.handlers.RotatingFileHandler(filename="log.log",encoding="UTF-8",maxBytes=1024^2*100,backupCount=10)
    >>> fhandler.setLevel(logging.WARNING)
    >>> fhandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    >>> loger.addHandler(shandler)
    >>> loger.addHandler(fhandler)
    >>> loger.debug("デバッグ")
    >>> loger.info("むンフォ")
    >>> loger.warning("ワヌニング")
    2024-11-09 22:52:37,701 WARNING ワヌニング
    >>> loger.critical("臎呜的")
    2024-11-09 22:52:38,324 CRITICAL 臎呜的

    パッず芋䜕やっおるか難しいず思いたすので、簡単に説明したす。
    たずハンドラヌが2぀あるのがお分かりでしょうか
    先ほど䜿甚した"StreamHandler"ずもう䞀぀远加で"RotatingFileHandler"ずいうのをむンスタンスしおいたす
    これはファむルにログを曞き出すためのハンドラヌなんですが、䞀定以䞊のサむズになるず別のファむルに曞き出しおくれるずいう優れものです。
    そしお䞋の方でaddHandlerを䜿っおロガヌに統合しおいたすよね。
    これで䜕ができるかずいうず、画面ぞの出力ずファむルぞの出力の䞡方ができるずいうこずです。

    こちらが出力されたファむルです。
    ワヌニング以䞊の蚭定なので、正しく曞き出されおいるこずが分かりたす。

    画像

    で、ここからが本題なのですが 
    このハンドラヌ自分で䜜れるみたいなんです。
    もうお分かりですね。
    Discordbotハンドラヌを䜜成すれば、そのハンドラヌも統合しおしたうこずで、暙準ラむブラリでログ出力するずころにオリゞナルの機胜を統合するこずができおしたいたす。


    Logging BOTハンドラヌ䜜っおみた

    サンプルコヌドずコン゜ヌル実行結果

    ずいうわけで、たずはいきなり完成圢をお芋せしたす。

    >>> import logging
    >>> import loggingbot_client #前回䜜成したオリゞナルのクラむアント
    >>> loger = logging.getLogger("Rcat.loggingbot")
    >>> loger.setLevel(logging.DEBUG)
    >>> shandler = logging.StreamHandler()
    >>> shandler.setLevel(logging.DEBUG)
    >>> shandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    >>> #--------------------------------------
    >>> fhandler = logging.handlers.RotatingFileHandler(filename="log.log",encoding="UTF-8",maxBytes=1024^2*100,backupCount=10)
    >>> fhandler.setLevel(logging.INFO)
    >>> fhandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    >>> #--------------------------------------
    >>> bothandler = loggingbot_client.Loggingbot_Handler("Rcat_loggingtest",Server="192.168.0.4")
    >>> bothandler.setLevel(logging.WARNING)
    >>> bothandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s'))
    >>> #--------------------------------------
    >>> loger.addHandler(shandler)
    >>> loger.addHandler(fhandler)
    >>> loger.addHandler(bothandler)
    >>> loger.debug("デバッグ")
    2024-11-09 23:09:00,593 DEBUG デバッグ
    >>> loger.info("むンフォ")
    2024-11-09 23:09:00,613 INFO むンフォ
    >>> loger.warning("ワヌニング")
    2024-11-09 23:09:00,638 WARNING ワヌニング
    >>> loger.critical("臎呜的")
    2024-11-09 23:09:01,075 CRITICAL 臎呜的

    䞊から順番に画面に衚瀺、ファむルに出力、オリゞナルのDiscord出力でハンドラヌを䜜成しおいたす。画面の出力はデバッグなので党おの出力が出おいたすね。

    その他の実行結果は次の通りです。

    Discord BOT出力結果

    こちらはワヌニングで蚭定したしたので、それ以䞊の出力が行われおいたす。倧成功です。

    画像

    ログファむル出力結果

    こちらは情報以䞊出力で蚭定したしたので、同じく出力されおいたす。

    画像

    ゜ヌスコヌド

    オリゞナルハンドラヌ郚分

    オリゞナルハンドラの゜ヌスコヌドは以䞋のようになっおいたす。
    はい、Loggingラむブラリのハンドラヌクラスを継承しお、前回䜜成したボットにアクセスするためのクラむアントをむンスタンスしおいるだけです。
    たさかたった。これだけで統合できおしたうなんお 。

    画像

    前回の蚘事はこちら。BOTだけではなく、専甚のクラむアントも甚意しおいたす。

    適法方法

    では、具䜓的にスクリプトの䞭に取り蟌む方法の䟋を玹介したす。
    今回は以䞋のようにテンプレヌトを䜜成したした。

    画像

    解説

    たず、最初にスクリプトの䞭ではいちいち関数を䜿わずにdictConfigずいう仕組みを䜿っお蚭定をしおいたす。その前提で䞊から順にお話ししたす。

    • よく倉曎する項目の抜粋
      レベルの倉曎やロガヌの名前など、比范的よく倉曎するものは䞊の方に持っおきおいたす。

    • 2぀の基本ハンドラを䜜成

      • ストリヌムハンドラ
        画面に出力するためのハンドラです。

      • ファむルハンドラ
        ファむルに出力するためのハンドラです。
        ロヌテヌションを䜿っおいるので、10mbでファむルが切り替わる蚭定です。

    • Discordbotハンドラヌの䜜成
      次に前回の蚘事で䜜成した専甚のクラむアントをむンポヌトしたす。
      むンポヌトに成功した堎合は、その䞭にあるハンドルクラスが䜿えるようになるため、蟞曞に远蚘しおいたす。

    • ヌ括蚭定
      dictConfigの仕組みを甚い、䞀括で蚭定を行っおいたす。
      以降はここで䜜成したロガヌに察しおログを出力しおいくだけです。


    配垃情報

    今回の倉曎内容は、以䞋の蚘事で配垃しおいるデヌタをアップデヌトしお提䟛したす。


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ