printデバッグ!Pythonのloggingモジュールでデキるエンジニアの第一歩

こんにちは。ゆうせいです。

プログラムを開発しているとき、変数の値を確認したり、処理がどこまで進んだかを見たりするために、どうしていますか? もしかして、たくさんのprint()をコードのあちこちに埋め込んでは、確認が終わったら消して……なんてことを繰り返していませんか?

その気持ち、とてもよく分かります。手軽で直感的ですもんね。でも、実はもっとスマートで、プロフェッショナルな方法があるんです。それが今回紹介する「loggingモジュール」です!

この記事を読み終える頃には、あなたはprintデバッグを卒業し、保守性の高いコードを書くための強力な武器を手に入れているはずですよ。

loggingモジュールって、一体何?

一言で言うと、loggingモジュールは「プログラムの動作を記録するための仕組み」です。

船の航海日誌を想像してみてください。いつ、どこで、何が起こったのか、どんな天候だったのか、といった情報が時系列で記録されていますよね。後からその日誌を読めば、航海の様子を正確に把握できます。

loggingモジュールがやっているのは、まさにこれと同じこと。プログラムの実行中に起きた様々な出来事(イベント)を、後から確認できる形で記録してくれるんです。print()がその場限りの「声」だとしたら、loggingはきちんと整理された「日誌」や「議事録」のようなもの、と考えると分かりやすいかもしれません。

なぜprint()じゃダメなの? loggingのメリット

「でも、print()でも記録はできるじゃないか」と思いますよね。もちろんです。しかし、loggingモジュールにはprint()にはない、たくさんのメリットがあるんです。

メリット1:メッセージのレベル分けができる

loggingには、記録したい情報の重要度に応じて5つの「レベル」が用意されています。

  • DEBUG: 開発中にだけ見たい、詳細な情報。
  • INFO: プログラムが正常に動作していることを示す、一般的な情報。
  • WARNING: 今は問題ないけれど、将来的に問題になるかもしれないという警告。
  • ERROR: 何らかのエラーが発生して、一部の処理が実行できなかった場合。
  • CRITICAL: プログラム全体が停止してしまうような、致命的なエラー。

これは、ニュース速報のレベル分けに似ていますね。DEBUGはごく一部の関係者だけが知ればいい内部情報、CRITICALは全国民に知らせるべき緊急速報、といったイメージです。

このレベル分けのおかげで、「開発中はDEBUGレベルまで全部表示するけど、本番環境ではWARNINGレベル以上だけを記録する」といった柔軟な制御が簡単にできます。print()だと、不要なメッセージを一つ一つコメントアウトしていくしかありませんよね?

メリット2:出力先を自由に変えられる

print()の出力先は、基本的に画面(コンソール)だけです。一方、loggingは、画面への出力はもちろん、ファイルへの書き出し、メールでの通知など、出力先を自由自在に変更できます。

プログラムを動かしているサーバーで何か問題が起きたとき、わざわざサーバーにログインして画面のログを遡るのは大変です。しかし、ログをファイルに保存するように設定しておけば、後からそのファイルをダウンロードして、落ち着いて分析することができます。

メリット3:情報が豊富で、形式も自由自在

loggingを使うと、メッセージ本体だけでなく、そのメッセージが記録された「時刻」や「ファイル名」、「行番号」、「ログのレベル」といった付加情報も一緒に記録できます。

Python

# 例:2025-10-10 16:11:21,833 - ERROR - ユーザー情報の取得に失敗しました。

このような形式で記録されていれば、「いつ、どこで、何が起きたのか」が一目瞭然ですよね。print()で同じことをしようとすると、毎回手動で時刻などを文字列に含めなければならず、非常に手間がかかります。

loggingモジュールの基本的な使い方

では、実際にどうやって使うのか見ていきましょう。とっても簡単ですよ!

まずはloggingモジュールをインポートします。そして、basicConfigという関数を使って、最低限の設定を行います。import logging

# 基本的な設定
# level=logging.INFO とすることで、INFOレベル以上のメッセージが表示される
logging.basicConfig(level=logging.INFO)

logging.debug("これは詳細なデバッグ情報です。") # 表示されない
logging.info("処理を開始しました。") # 表示される
logging.warning("設定ファイルが見つかりません。デフォルト値を使います。") # 表示される
logging.error("データベースへの接続に失敗しました。") # 表示される
logging.critical("致命的なエラー。サーバーを停止します。") # 表示されるまずはloggingモジュールをインポートします。そして、basicConfigという関数を使って、最低限の設定を行います。

import logging

# 基本的な設定
# level=logging.INFO とすることで、INFOレベル以上のメッセージが表示される
logging.basicConfig(level=logging.INFO)

logging.debug("これは詳細なデバッグ情報です。") # 表示されない
logging.info("処理を開始しました。") # 表示される
logging.warning("設定ファイルが見つかりません。デフォルト値を使います。") # 表示される
logging.error("データベースへの接続に失敗しました。") # 表示される
logging.critical("致命的なエラー。サーバーを停止します。") # 表示される

このコードを実行すると、debugメッセージは表示されないはずです。なぜなら、basicConfigで「INFOレベル以上のものだけを表示してね」と設定したからです。このlevellogging.DEBUGに変えれば、すべてのメッセージが表示されるようになります。簡単でしょう?

ログをファイルに書き出す

ログをファイルに保存したい場合も、basicConfigを少し変更するだけです。

import logging

logging.basicConfig(filename='app.log', level=logging.INFO)

logging.info("このメッセージはコンソールではなく、app.logファイルに書き込まれます。")

filenameという引数を追加しただけですね。これで、プログラムと同じディレクトリにapp.logというファイルが作成され、そこにログが記録されていきます。

loggingを使う上での注意点

とても便利なloggingモジュールですが、一つだけ注意点があります。それは、パスワードや個人情報といった、機密性の高い情報をログに含めないことです。

ログは、問題解決のための重要な手がかりですが、万が一外部に漏洩した場合、大きなセキュリティリスクになります。何をログに出力するかは、常に意識するようにしてくださいね。

次のステップへ

さて、今回はPythonのloggingモジュールの基本的な考え方と使い方を解説しました。print()によるデバッグから卒業できそうですか?

まずは、今作っている小さなプログラムにloggingを導入することから始めてみてください。「とりあえずprint()で」という癖を、「まずはloggingで」に変えていくのです。

そして、loggingに慣れてきたら、次は以下のようなテーマについて調べてみると、さらに理解が深まるでしょう。

  • フォーマッタ: ログの出力形式をより細かくカスタマイズする方法。
  • ハンドラ: ログをファイルだけでなく、様々な場所に出力するための仕組み。
  • ロガー: 大規模なアプリケーションで、モジュールごとにログを管理する方法。

これらを使いこなせるようになれば、あなたの書くコードはもっと堅牢で、プロフェッショナルなものになるはずです。頑張ってください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。