1. はじめに|ログって何?なぜ必要?
こんにちは!この記事では、Pythonプログラミングでとても大事な「ログ出力(logging)」についてやさしく解説していきます。
さて、まずは「ログってそもそも何?」というところから始めましょう。
ログは「プログラムの記録係」
ログというのは、プログラムの中で「今こんな処理をしたよ」とか「ここでエラーが起きたよ」といったメッセージを記録する仕組みのことです。
たとえば──
- プログラムがちゃんと動いてるか確認したいとき
- エラーが起きた原因をあとで見返したいとき
- 本番環境で何が起きたか追跡したいとき
こんなときに、ログがあればとっても助かるんです!
printだけじゃダメなの?
Pythonを学び始めたばかりの人の多くは、print()でデバッグしてるかもしれませんね。たとえば:
print("処理開始!")
もちろん、これはこれで悪くないのですが…
👉 本格的なプログラムになると、ログの管理が大変になります。
- どの処理で出したメッセージなのか?
- どのレベルの重要度なのか?
- いつ実行されたのか?
- ログをファイルに保存しておきたい!
こういったことを考えると、print()では対応しきれません。
loggingモジュールが助けてくれる!
そこで登場するのが、Python標準のログ出力機能「loggingモジュール」です。
このモジュールを使えば、**ログの出力先、出力形式、重要度レベル(ログレベル)**などを自由にコントロールできるようになります。エラー調査や動作チェックも、グッとやりやすくなりますよ!
2. loggingモジュールとは?|Python標準のログ出力機能
「ログが大事なのはわかったけど、実際どうやって使うの?」
そんなあなたに紹介したいのが、Pythonに最初から入っている便利なモジュール──それが logging です!
loggingモジュールってなに?
loggingは、Pythonの標準ライブラリのひとつで、ログ出力に特化した専用ツールです。
これを使うと、次のようなことができるようになります:
print()よりも細かくログを管理できる!- **ログの重要度(ログレベル)**を使い分けられる!
- ログをファイルに保存できる!
- ログの出力形式を自由にカスタマイズできる!
たとえば、「DEBUGレベルのメッセージはコンソールに出すけど、ERROR以上のメッセージはファイルにも保存したい!」みたいなこともできちゃいます。
printとloggingの違いはここ!
| 比較項目 | print() | logging |
|---|---|---|
| 出力先 | 標準出力(コンソール)だけ | コンソール、ファイル、ネットワークなど |
| ログの重要度 | 設定不可 | DEBUG〜CRITICALの5段階で管理可能 |
| 出力形式の変更 | 自分で組み立てる必要あり | Formatterで簡単にカスタマイズ可能 |
| 本番環境での利用 | 推奨されない | 本番運用にも使えるプロ仕様 |

print()は小さなスクリプトや学習用には便利ですが、実際の開発や運用ではloggingを使うのが圧倒的におすすめです。
3. loggingの基本構成|ロガー・ハンドラー・フォーマッターとは
さて、ここからは実践編です。loggingモジュールをうまく使うために、まずは3つの重要な構成要素を覚えておきましょう!
ログ出力の仕組みは「ロガー」「ハンドラー」「フォーマッター」の3つでできています。
イメージで例えるなら、こんな感じです:
ロガー:伝言を作る人
↓
ハンドラー:伝言を届ける方法(声で?紙で?)
↓
フォーマッター:伝言の書き方(日時や名前を付ける?)
① Logger(ロガー)|ログを出す「司令塔」
ロガーは、「この内容をログとして出力して!」と指示を出す役割を持っています。
from logging import getLogger
logger = getLogger(__name__)
ロガーは通常、getLogger(__name__) のように書きます。これは「このファイル内のログですよ」という意味になります。
② Handler(ハンドラー)|ログの届け方を決める人
ハンドラーは、ログをどこにどうやって出力するかを決める部品です。
たとえば:
- コンソール(ターミナル)に表示したい →
StreamHandler - ファイルに保存したい →
FileHandler
from logging import StreamHandler, FileHandler
stream_handler = StreamHandler() # コンソール出力
file_handler = FileHandler('log.txt') # ファイル出力
複数のハンドラーを同時に使うこともできます!
③ Formatter(フォーマッター)|ログの見た目を整える人
フォーマッターは、ログの出力形式(レイアウト)を決める人です。
たとえば、こんな感じで設定できます:
from logging import Formatter
formatter = Formatter('[%(levelname)s] %(asctime)s - %(message)s')
stream_handler.setFormatter(formatter)
この設定をすると、以下のようなログが出力されるようになります:
[INFO] 2025-06-10 12:34:56,789 - データの読み込み完了
まとめ:loggingの三本柱を意識しよう!
| 要素 | 役割 | よく使うクラス名 |
|---|---|---|
| Logger | ログを出力する命令を出す | getLogger() |
| Handler | ログをどこに出すかを決める | StreamHandler, FileHandler |
| Formatter | ログの見た目(書式)を決める | Formatter |
4. ログレベルの種類と意味|適切に使い分けよう
loggingモジュールの便利なところの一つに、「ログの重要度(ログレベル)を設定できる」という点があります。
たとえば、「これはちょっとした確認メッセージ」「これは重大なエラーだ!」といった違いを、ログにちゃんと反映できるんです。
ログレベルってなに?
ログレベルとは、ログの「重要さ」や「緊急度」を示すものです。
Pythonでは、以下の5段階が用意されています:
| ログレベル名 | 説明 |
|---|---|
| DEBUG | 開発中に使う。詳細な情報。動作確認や変数の中身などの出力に使います。 |
| INFO | 正常な処理の進行状況を記録するレベル。処理の開始・完了メッセージなど。 |
| WARNING | 予期せぬことが起きたけど続行可能な場合。軽微な問題を知らせる警告です。 |
| ERROR | プログラムが失敗した処理を記録。例外などが発生した場合に使います。 |
| CRITICAL | 致命的なエラー。システムが停止するような重大な障害時に使用します。 |
具体例を見てみよう!
logger.debug("これはデバッグ用のメッセージです")
logger.info("処理が正常に完了しました")
logger.warning("ファイルが見つかりませんでした(でも続行します)")
logger.error("データの読み込みに失敗しました")
logger.critical("システムを終了します!重大なエラーです")
このように、メッセージの「意味」によってレベルを使い分けることで、あとでログを見返すときに重要な情報を素早く見つけることができます!
ログレベルを使い分けることで得られるメリット
✅ 開発中と本番でログの出力を切り替えられる!
→ DEBUGレベルは開発中だけ表示、本番ではINFO以上だけ表示など
✅ エラーだけを抽出して確認できる!
→ WARNINGやERRORだけをファイルに保存する設定も可能
✅ ログが整理されて、読みやすくなる!
→ メッセージに意味の「ラベル」がつくイメージ
ログが出力される条件に注意!
ログを出力するには、ロガーとハンドラーの両方に「ログレベルの設定」が必要です。
logger.setLevel(DEBUG) # ロガー側の最低レベル
handler.setLevel(INFO) # ハンドラー側の最低レベル
この場合、INFO以上のログだけが出力されます(DEBUGは無視されます)。
🚨 どちらか一方だけ設定しても効果がないので、両方に設定するのを忘れずに!
5. 実装してみよう|StreamHandlerでコンソールに出力
ここからは、実際にコードを書きながらloggingの使い方を体験してみましょう!
まずは一番シンプルな例として、「ログをコンソール(ターミナル)に出力する方法」からスタートします。
✅ 今回は「StreamHandler(ストリームハンドラー)」を使います。
これは「標準出力(printと同じような出力先)にログを流す」ためのハンドラーです。
🌱 ステップ1:必要なものをインポートしよう
まずは、loggingモジュールの中から使いたい部品をインポートします。
from logging import getLogger, StreamHandler, DEBUG
🧱 ステップ2:ロガーを作成する
getLogger(__name__) でロガーを作ります。
logger = getLogger(__name__)
📦 ステップ3:ハンドラーを作ってログレベルを設定
コンソール出力用のハンドラーを作り、ログレベルを設定します。
handler = StreamHandler()
handler.setLevel(DEBUG)
🧩 ステップ4:ロガーにもログレベルを設定しよう
ロガー自体にもレベル設定をします。これがないとログが出ないことも!
logger.setLevel(DEBUG)
🔗 ステップ5:ロガーにハンドラーを追加
ハンドラーをロガーにくっつけて、ログの出力先を指定します。
logger.addHandler(handler)
🗣️ ステップ6:実際にログを出してみよう!
ログレベルごとのメッセージを出してみます。ちゃんと出るか確認してみましょう!
logger.debug("これはデバッグログです")
logger.info("これはインフォログです")
logger.warning("これはワーニングログです")
logger.error("これはエラーログです")
logger.critical("これはクリティカルログです")
💡 ここまでのコードまとめ(コピペOK!)
from logging import getLogger, StreamHandler, DEBUG
# ロガーとハンドラーの作成
logger = getLogger(__name__)
handler = StreamHandler()
# ログレベルの設定
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
# ハンドラーをロガーに追加
logger.addHandler(handler)
# ログ出力
logger.debug("これはデバッグログです")
logger.info("これはインフォログです")
logger.warning("これはワーニングログです")
logger.error("これはエラーログです")
logger.critical("これはクリティカルログです")
👀 実行結果(例)
これはデバッグログです
これはインフォログです
これはワーニングログです
これはエラーログです
これはクリティカルログです
※ ここではフォーマッターを設定していないので、シンプルなログ表示になっています。
6. ログ出力形式の指定|Formatterで見た目を整えよう
前のセクションでは、ログをコンソールに出力できるようになりましたね!
でも、こんなふうに思いませんでしたか?
「ログが全部同じ見た目で、どのログが重要なのか分かりづらい…」
「エラーがいつ起きたのか、時間も一緒に出てほしいな…」
そんなときは、Formatter(フォーマッター)を使ってログの見た目=形式をカスタマイズしましょう!
✨ Formatterって何をするの?
Formatterは、ログ出力の「テンプレート」を作ってくれる部品です。
たとえば:
[INFO] 2025-06-10 13:00:01 - ログメッセージ(main.py)
こんなふうに、
- ログの種類(INFO、DEBUGなど)
- 時間
- メッセージ本文
- 出力元ファイル名
などを自由に組み合わせて表示できるんです!
🛠️ よく使うフォーマット指定子一覧
| 指定子 | 意味 |
|---|---|
%(levelname)s | ログレベル(DEBUGなど) |
%(asctime)s | ログを出力した時間 |
%(message)s | ログのメッセージ本文 |
%(filename)s | 実行しているファイル名 |
🧪 使い方:Formatterの作成と設定
では、実際にコードを書いてみましょう!
from logging import Formatter
# フォーマッターの作成(ログの見た目を定義)
formatter = Formatter('[%(levelname)s] %(asctime)s - %(message)s (%(filename)s)')
この例では、「ログレベル」「時間」「メッセージ」「ファイル名」が表示されるようになります。
次に、このフォーマッターをハンドラーに設定します。
handler.setFormatter(formatter)
💡 フォーマッター付きのコード全体(コピペOK!)
from logging import getLogger, StreamHandler, Formatter, DEBUG
# ロガーとハンドラーの作成
logger = getLogger(__name__)
handler = StreamHandler()
# ログレベルの設定
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
# フォーマッターの設定
formatter = Formatter('[%(levelname)s] %(asctime)s - %(message)s (%(filename)s)')
handler.setFormatter(formatter)
# ハンドラーをロガーに追加
logger.addHandler(handler)
# ログ出力
logger.info("ログフォーマットを整えてみました!")
logger.error("エラーが起きました!")
📋 実行結果(例)
[INFO] 2025-06-10 13:20:00,123 - ログフォーマットを整えてみました! (main.py)
[ERROR] 2025-06-10 13:20:00,124 - エラーが起きました! (main.py)
これなら、あとでログを読み返すときもとても見やすいですよね!

次は、「ログをファイルに保存する方法(FileHandler)」を紹介します。
プログラムの実行履歴を残しておきたいときに便利なので、ぜひ覚えておきましょう!
7. ファイルに出力してみよう|FileHandlerの活用法
これまでに、コンソールにログを出力する方法を学びました。
でも、実際の開発ではこんな場面もよくあります:
🔍 「あとでログを見返したい」
💾 「ログをファイルに保存しておきたい」
🛠️ 「本番環境では画面に出さず、ファイルだけに記録したい」
そんなときに活躍するのが、loggingモジュールの**FileHandler(ファイルハンドラー)**です!
📁 FileHandlerとは?
FileHandlerは、ログの出力先をファイルに指定できるハンドラーです。
つまり、StreamHandlerが「画面に出す人」だとしたら、FileHandlerは「記録帳に書く人」ですね。
🧪 FileHandlerを使ったログ出力の手順
使い方はとってもカンタン。これまでとほとんど同じです!
from logging import getLogger, FileHandler, Formatter, DEBUG
# ロガーの作成
logger = getLogger(__name__)
logger.setLevel(DEBUG)
# ファイルハンドラーの作成(log.txtというファイルに出力)
file_handler = FileHandler('log.txt')
file_handler.setLevel(DEBUG)
# フォーマッターの設定
formatter = Formatter('[%(levelname)s] %(asctime)s - %(message)s')
file_handler.setFormatter(formatter)
# ハンドラーをロガーに追加
logger.addHandler(file_handler)
# ログ出力
logger.info("これはファイルに保存されたログです")
logger.error("これはファイルにも残したいエラーです")
📝 実行結果(log.txtの中身)
[INFO] 2025-06-10 13:45:00,456 - これはファイルに保存されたログです
[ERROR] 2025-06-10 13:45:00,457 - これはファイルにも残したいエラーです
ファイル log.txt が作成され、その中にログが追記されていきます!
💡 ワンポイント:ファイルが増えすぎるのを防ぎたいときは?
ログが多くなると、ファイルがどんどん巨大になって困る…
そんなときは RotatingFileHandler などを使えば、一定サイズを超えたらファイルを自動で分割することもできます(※応用編で解説予定です)。
🧩 StreamHandlerとFileHandlerを一緒に使う
「画面にも出して、ファイルにも保存したい!」というときは、複数のハンドラーを同時に追加すればOKです。
from logging import StreamHandler
stream_handler = StreamHandler()
stream_handler.setFormatter(formatter)
stream_handler.setLevel(DEBUG)
logger.addHandler(stream_handler) # 画面出力も追加!

これで、画面とファイルの両方にログが出力されるようになります!
8. 応用:ログレベルごとのファイル分離出力
ここまで学んだ内容で、基本的なログ出力はバッチリですね!
でも、開発が進んでくると、こんな悩みも出てきます。
🔍「エラーログだけ見たいのに、DEBUGのログで埋もれて見つけづらい…」
💾「ログの重要度ごとにファイルを分けて保存できたら便利なのに…」
そんなときにおすすめなのが、ログレベルごとのファイル分離出力です!
📁 ログレベル別にファイルを分けるとは?
たとえば以下のように、ログの重要度に応じてファイルを分けて保存します:
| ファイル名 | 含まれるログのレベル |
|---|---|
debug.log | すべてのログ(DEBUG〜CRITICAL) |
error.log | エラー以上のログ(ERROR, CRITICAL) |
これなら、重要なログだけをサッと確認できて、全体の流れも残しておけるというわけです!
🧪 実装例:2つのFileHandlerを使う
from logging import getLogger, FileHandler, Formatter, DEBUG, ERROR
# ロガーの作成
logger = getLogger(__name__)
logger.setLevel(DEBUG)
# フォーマッターの設定
formatter = Formatter('[%(levelname)s] %(asctime)s - %(message)s')
# DEBUGレベル以上のログを保存するハンドラー(全ログ)
debug_handler = FileHandler('debug.log')
debug_handler.setLevel(DEBUG)
debug_handler.setFormatter(formatter)
# ERRORレベル以上のログを保存するハンドラー(重要ログのみ)
error_handler = FileHandler('error.log')
error_handler.setLevel(ERROR)
error_handler.setFormatter(formatter)
# ロガーに両方のハンドラーを追加
logger.addHandler(debug_handler)
logger.addHandler(error_handler)
# ログを出力してみる
logger.debug("デバッグ用の情報です")
logger.info("通常の処理が完了しました")
logger.warning("注意が必要な状態です")
logger.error("エラーが発生しました")
logger.critical("システム障害!緊急対応が必要です")
💡 実行後のログファイルの中身(例)
📄 debug.log
[DEBUG] 2025-06-10 14:00:00,001 - デバッグ用の情報です
[INFO] 2025-06-10 14:00:00,002 - 通常の処理が完了しました
[WARNING] 2025-06-10 14:00:00,003 - 注意が必要な状態です
[ERROR] 2025-06-10 14:00:00,004 - エラーが発生しました
[CRITICAL] 2025-06-10 14:00:00,005 - システム障害!緊急対応が必要です
📄 error.log
[ERROR] 2025-06-10 14:00:00,004 - エラーが発生しました
[CRITICAL] 2025-06-10 14:00:00,005 - システム障害!緊急対応が必要です
🎯 ポイントまとめ
- ロガーのレベルは 最も低いレベル(例:DEBUG) にしておく
- ハンドラーごとに異なるレベルを設定して、必要なログだけを出力
- 複数のログファイルを使い分けることで、保守や運用がグッと楽になる!

これで、loggingモジュールの基本から応用まで一通りマスターできました!
9. まとめ|loggingでログ管理をスマートに!
おつかれさまでした!ここまで読んでいただき、ありがとうございます。
この記事では、Pythonのloggingモジュールを使ってログを出力・管理する方法を、基本から応用までじっくり解説してきました。
あらためて、ポイントをふりかえってみましょう!
✅ この記事のポイント
loggingモジュールを使うと、printより高機能なログ管理ができる- ログ出力には3つの要素「ロガー」「ハンドラー」「フォーマッター」がある
- ログレベルを使い分けることで、重要なメッセージを見逃さない
StreamHandlerでコンソールに、FileHandlerでファイルに出力できる- 応用として、ログレベルごとにファイルを分けるテクニックも使える

最初はちょっと複雑に感じるかもしれませんが、慣れてくると「loggingがない開発なんて考えられない!」という気持ちになるくらい、ログは便利な武器になります。
Pythonで本格的な開発やデバッグをするなら、ぜひloggingモジュールを使いこなしてみてくださいね!
🔗 あわせて読みたい
- 👉 Pythonエラーが怖くなくなる!初心者向けエラーメッセージの読み方講座
- 👉 Pythonのprintデバッグ活用術|初心者でもできるエラー解決の第一歩
- 👉 Python初心者がよくつまずくエラー10選と解決法まとめ
よくある質問(Q&A)
- Q
print()じゃダメなんですか? - A
小さなスクリプトや学習用ならOKですが、
print()にはログレベルの管理やファイル出力の機能がありません。プロジェクトが大きくなるほど、loggingの便利さが活きてきます!
- Qログが出力されないのはなぜ?
- A
よくある原因は「ロガーとハンドラーの両方にレベル設定をしていない」こと。
logger.setLevel()とhandler.setLevel()の両方を忘れずに設定しましょう!
- Qログファイルがどんどん大きくなって不安です…
- A
その場合は、
RotatingFileHandlerやTimedRotatingFileHandlerを使って、ファイルを分割して保存する設定が可能です(応用記事で詳しく紹介予定です!)







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。