見出し画像

【logging】Python初心者を卒業するログ出力【自動化に必須】

■ なぜログ出力を学ぶのか

今回はPythonのログ出力について解説します。
初心者がプログラムを作成する際、「print()」で内容を確認しながら完成を目指していくと思います。
「print()」を用いたデバッグは非常に手軽で、必要な効果を得ることができると感じますよね。

しかしながら、プログラムを自動で稼働し続けたりすると、イレギュラーな条件でのエラー(「スクレイピングしていたサイト構造が緊急のニュースで一時的に変化した」など)のせいで、

「その瞬間のログが残っていたらよかったのにいい!!」
「ログが無いから対処できないじゃん!!」

ということはよくあることです。
初めは必要性を感じることが無いかもしれませんが、プログラミングが上達していき、仕事や日常で活用しはじめると、この「ログ出力」という技術は必須のものになります

この記事の内容は、コピペでログ出力を実践しながら理解できるよう構成しています
本プログラムをそのまま活用することもできますから、この機会にぜひログ出力を習得し、初心者から一歩進んだプログラミングを学びましょう!


■ 環境設定

今回のサンプルプログラムを実行する環境を紹介します。
Pythonの実行環境はGoogle Colaboratory(以下Colab)を使用します。
Colabを使ったことのない方は、過去の記事にColab環境の作成方法をまとめていますので、そちらをご覧ください
手順の1~5まででOKです。今回は「追加設定1~2」は必要ありません。)
10分程度で作れてしまうので、ぜひ気軽に取り組んでみてください。


■ ログ出力プログラム

実際のサンプルプログラムを紹介します。
以下のプログラムをコピーし、Colabへ張り付けるだけで実行することができます▼

import os
from logging import getLogger, StreamHandler, FileHandler, Formatter, DEBUG, INFO

DIR_PATH = "/content/logging_test"


def make_dir():
    """ Colabのランタイムに(GoogleDriveではなく)ディレクトリを作成する
    """
    os.makedirs(DIR_PATH, exist_ok=True)


def make_logger():
    """ loggerオブジェクトの作成
    """
    global logger

    # loggerオブジェクトを生成する
    logger = getLogger(__name__)
    logger.setLevel(DEBUG)
    logger.propagate = False

    # ログを出力セル(コンソール)表示するためのHandlerを設定する
    streamHandler = StreamHandler()
    fileFormat = Formatter("%(asctime)s - %(levelname)-8s - %(message)s")
    streamHandler.setFormatter(fileFormat)
    streamHandler.setLevel(DEBUG)
    logger.addHandler(streamHandler)

    # ログをファイルに記録するためのHandlerを設定する
    fileHandler = FileHandler(f"{DIR_PATH}/test.log", encoding="utf-8")
    fileFormat = Formatter("%(asctime)s - %(levelname)-8s - %(message)s")
    fileHandler.setFormatter(fileFormat)
    fileHandler.setLevel(INFO)
    logger.addHandler(fileHandler)


def logger_test():
    """ loggerの挙動を確認する
    """
    logger.debug("DEBUGレベルです")
    logger.info("INFOレベルです")
    logger.warning("WARNINGレベルです")
    logger.error("ERRORレベルです")
    logger.critical("CRITICALレベルです")


def kill_handlers():
    """ Handlerをすべて削除して後片づけする
    """
    for h in logger.handlers[::1]:
        logger.removeHandler(h)


if __name__ == "__main__":
    make_dir()
    make_logger()
    logger_test()
    kill_handlers()


■ サンプルプログラム実行結果

実行してみましたか?
早速、実行結果を確認していきましょう。

確認1
まず、ファイル情報の更新をクリックし、
・「logging_test」ディレクトリ
・「test.log」ファイル

が作成されているか確認します▼

スクリーンショット 2021-05-20 112128

確認2
次に、「test.log」ファイルをダブルクリックし、ログがファイル出力されていることを確認します▼

スクリーンショット 2021-05-21 140754

確認3
最後に、ログが出力セルにも表示されているか確認します。
以下の内容が表示されていることを確認してください▼

スクリーンショット 2021-05-21 140838


■ printとloggingの違い

サンプルプログラムを実行して、「print」と「logging」の違いをがわかりましたか?
ざっくり違いをまとめてみると以下の通りです▼

--- print ---
・出力セル(コンソール)の表示のみ(ログファイルへ出力できない)
・プログラムを監視していないとエラー情報がわからない
--- logging ---
・出力セル
(コンソール)、ログファイル、両方の出力が可能
・ログの出力レベルを設定し、出力セル・ログファイルそれぞれの出力内容を設定できる
・プログラムを監視していなくてもエラー情報を知ることができる
・プログラムの自動化に非常に有用

初めのうちはピンとこない部分もあると思いますが、ひとまず、「プログラムを自動で動かしていきたいなら、ログ出力ができると便利」ということだけ覚えておいてください。
ちなみに、出力方法は「print()」とほとんど変わらないということは、サンプルプログラムを見て分かる通りです▼

print("hello")
logger.info("hello")

とても似たような書き方ですが、loggingライブラリを用いた方が様々なメリットを受けることができます
そのメリットを活かすためにも、loggingライブラリをしっかりと使いこなしていきましょう!


■ 有料部分のコンテンツ紹介

ある程度プログラムを活用されている方は、公開したサンプルプログラムを見ただけでもloggingライブラリの扱い方は理解できると思います。
しかしながら、まだプログラムに慣れていない方は、

プログラムは動いたけど、何がすごいんだ?」
「実際に、どう実用していけばいいの?

という気持ちだと思います。
そこでここからは、より踏み込んだ解説と、実運用でどのように使用するのかを紹介していきます。
有料部分のコンテンツ内容をまとめると以下の通りです▼

・公開プログラムの解説
・実際の使用例
・Google Drive上にログを出力する
・効率的にloggerを運用する方法
・logger設定のモジュール化
・自作モジュールのまとめ方

かじり虫の有料コンテンツは、「すぐに実用できるプログラムをコピペから学べる」ように作成してあります。
また、投資・トレード運用に興味のある方にとっては、「運用者が実際に使用しているプログラムを知ることができる」というのは貴重な機会です。
(他人のソースを見る機会はほとんどありません。特に投資の世界では。)
挫折せず、他の人よりも早くゴールまで登りきる」ための内容を詰め込んでいますので、ぜひ本コンテンツでPythonプログラミングの世界を味わい、学んでいってください。

また、紹介したプログラムの解説は初心者にもわかりやすいように作成していますが、「Python入門書の内容をざっくり押さえていて、初歩的な文法であれば自分で調べることができる」程度のレベルを想定しています。

ここから先は

12,100字 / 13画像

¥ 2,000

かじり虫の活動を応援してくださる方のサポート、お待ちしております。 これからも有意義なコンテンツを作成していきますので、私の「夢中」をぜひ一緒に共有していきましょう^^