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
レベル以上のものだけを表示してね」と設定したからです。このlevel
をlogging.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年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。