2019-05-12こんにちは。投資エンジニアの三年坊主(@SannenBouzu)です。今回は、Pythonでログを出力したい人の疑問に答えます。Pythonでログを出力するための基本的な書き方を教えてほしい。自分で作ったPythonプログラムが異常なく動いたか、実行中や実行後に一目で確認したい。logging入門というQiita記事では、このような内容が分かりやすく説明されています。できる限り公式の情報源を明示しながら「基本の使い方」を説明している有名な外部ライブラリを例にその説明を補強している今回の記事では、Qiita記事の情報も参考にしながら、自分で作ったPythonプログラムの実行結果や解説を、実際に動くサンプルコードとともに紹介したいと思います。合計5年以上Pythonを使ってきた私ですが、その経験も踏まえて、Pythonでログを出力する方法を紹介します。よければ参考にしてください。【2019年版】Pythonインストール・Mac編【長く安全に使える環境構築】PythonをMacにインストールする環境構築方法を具体的に紹介します。インストール後、バージョン切り替え・アップデート・アンインストールが気軽にできて、Pythonを長く安全に使える方法です。-fやlessコマンドでファイル出力を確認するloggingの出力に色をつけて見やすくする監視ツールを使う関連記事:こちらも読まれていますPythonでログを出力する方法【コピペで動くサンプル付】ライブラリ側(使われる側)とユーザ側(使う側)でログ出力のための書き方が違います。ライブラリ側とそれを使う側(ユーザー側)でloggingの書き方が違います。ここをごっちゃにすると、話が絶対に錯綜するので、必ず意識するようにします。細かな出力方法はユーザー側で設定するこの方法に従うことで、後からでも見やすいPythonのログを出力することができます。使われる側?使う側?ロガー?ちょっと何言ってるか分からない...たしかに文字だけではよく分からないですよね・・・最初に具体例を見ておきましょう。os説明のためにこのようなディレクトリ構造をつくります。test.py日時の計算をするためのdatetime_module.pyを自分で用意して、それをtest.pyから「使う」シチュエーションを考えてみましょう。datetime_module”しているので、datetime_module.pyが「使われる側」、test.pyが「使う側」になります。"""プログラム実行時点での日時を計算する。"""指定する日時が含まれる週の月曜日を計算する。get_datetime_now():"""プログラム実行時点での日時を計算する。get_monday(time):"""指定する日時が含まれる週の月曜日を計算する。datetime_module用のロガーを取得し、consoleハンドラを追加する。datetime_module用のロガーを取得し、consoleハンドラを追加する。細かな出力方法はユーザー側で設定するこのようになっているのが確認できると思います。$DEBUGレベル以上のログがlogs/sample.logファイルに記録されます。$_detail_formattingで指定していたので、プログラムが正常に動いたか確認するために役立つ情報がたくさん盛り込まれています。このくらい出力しておくと、「どのモジュールの何行目で問題があったか」一目で分かります。生成された時刻を人間が読める書式で表したもの。‘CRITICAL’)。ロギングの呼び出しを含む関数の名前。(利用できる場合のみ)。して求められた、ログメッセージ。呼び出されたときに設定されます。属性ロガー・ハンドラ・フィルタ・フォーマッタPython公式の上級ロギングチュートリアルによると、「ロガー」「ハンドラ」「フィルタ」「フォーマッタ」はこのように説明されています。ロガーは、アプリケーションコードが直接使うインタフェースを公開します。ログ記録を適切な送信先に送ります。フィルタは、どのログ記録を出力するかを決定する、きめ細かい機能を提供します。フォーマッタは、ログ記録が最終的に出力されるレイアウトを指定します。紹介したサンプルコードでも、Pythonプログラムからロガーを使ってログを生成し、ハンドラでそのログをどこに送信するか(ファイルに保存するのか、コンソールに出力するのか、など)を決めていました。フィルタは使いませんでしたが、フォーマッタを使ってログの出力形式を決めていました。基本ロギングチュートリアルを読むと、このあたりの話を出さずに「ただログが出力できればいい」という目的で書かれているようです。たしかにスムーズにログ出力がはじめられそうですが、「スムーズにはじめて後々困る」ことはプログラミング学習ではよく起こるので、あえて「ロガー」「ハンドラ」「フィルタ」「フォーマッタ」の概念を紹介しました。logging.getLogger(__name__)”を使ってモジュール(≒一つのファイル)ごとにロガーを作ってからログ出力しましょう。上の見出しで紹介した「Pythonでログを出力する方法」のメリットは、「print文を書いて問題箇所を特定する方法のデメリットを解消」していることです。ロガー・ハンドラ・フォーマッタを使って、どの内容のログをどこに出力するか制御しているので、ログを一目見ただけでPythonプログラムの実行状態や、不具合があればその問題箇所がすぐに分かるからです。end')出力結果を見てみるとずいぶん貧弱で見にくいですし、モジュールの名前を変えたらprint文の中身も全部自分で変えないといけません。$ファイルとコンソールの両方に同時に出力しようとすると、できなくはないですが、少なくともログレベルを設定したり、それに応じて出し分けをするようなことは難しいと思います。$短くて簡単なpythonプログラムの動きを確かめるだけなら、正直printデバッグではじめるのは悪くはないと思います。大きなプログラムを書き始めて、そろそろprintデバッグをやめてログ出力したいと思う人にとっては、インターネットで検索して見つかるprint文やlogging.log()だけでは限界を感じることがあるでしょう。繰り返しになりますが、「Pythonでログを出力する方法」のメリットは、「print文を書いて問題箇所を特定する方法のデメリットを解消」していることです。サンプルコードを参考に、少しずつ使いこなせるようにしていきましょう。Pythonプログラムの実行結果に異常がないか一目で確認するにはそもそもPythonでログを出力するのはなぜでしょうか?一番の目的は「Pythonプログラムの実行結果に異常がないか一目で確認するため」だと思います。Pythonプログラムが異常なく動いたか一目で確認するために、出力したログをうまく活用する方法を紹介します。-f”を実行すれば、Pythonプログラムを実行しながら、書き込まれていくログをリアルタイムで確認できます。logs/sample.logロガーを使ってログレベルを使い分けたログ出力をしていると、そのレベルを含む行だけ見ることもできて便利です。"ERROR"私自身は、このあたりの記事を読んで、lessコマンドという別のコマンドを使って監視していた時期もありました。logs/sample.logloggingの出力に色をつけて見やすくするPythonで色つきログを出力できるrainbow_logging_handlerを開発した人もいるようです。たしかに、ログレベルごとに色が分かれていると見やすいですよね。PyPIにリリースしました監視ツールを使う面倒なことは機械に任せましょう。Kibanaなど、システムのログなどを監視して、異常があれば通知してくれるようなツールもたくさんあります。出力したログは、活用してこそ意味があります。Pythonプログラムが異常なく動いたか確認するために、うまく活用していきましょう。税金面での優遇や、各自治体が工夫を凝らす返礼品でも何かと注目の「ふるさと納税」。高還元率の返礼品選びに消耗せず、自分が必要な返礼品を選ぶことで、お財布にも自治体にも嬉しいふるさと納税ができるよう、おすすめ情報を紹介します。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。当サイトおすすめサービスレバテック【転職】IT/Webエンジニア特化の「レバテック」。市場価値の確認と現職経験の棚卸しが納得のキャリアにつながります。転職を無理にすすめないプロにまずは無料で相談。詳細はこちら無料で相談ふるなび【ふるさと納税】ふるさと納税=税金の前払いで返礼品も受け取れるお得な制度。無料で登録トラリピ最初に設定するだけでコツコツ利益を積み重ねてくれる「トラリピ」。4投資エンジニア三年坊主500万DLアプリのJavaエンジニアを経て、広告の裏側を支える現役データエンジニア。資産運用・エンジニアの働き方・技術を中心に記事を書いています。