こんにちは!今回は、Pythonでプログラムの動作を記録する「loggingモジュール」について解説します。
Pythonで開発していると、つい print() でデバッグしてしまいがちですが、
本格的なアプリ開発では「logging」を使うのが定番です。
この記事では、初心者の方でもすぐに使えるように、
printとの違い・基本的な使い方・実践例を丁寧に紹介します。
loggingとは?なぜ必要?
printとの違い
| 比較項目 | print() | logging |
|---|---|---|
| 用途 | 一時的なデバッグ | 開発・運用両方 |
| 出力先 | 標準出力(コンソール) | ファイル、端末、メールなど自由 |
| 重要度レベル | なし | DEBUG / INFO / WARNING / ERROR / CRITICAL |
| 実運用 | 向かない | ログとして必須 |
loggingは、アプリの「動作履歴」を残すための仕組みです。例えばエラーの原因調査やユーザー動作の追跡に使われます。
基本の使い方(最初の一歩)
import logging
# ログ設定(最低レベルをINFOに設定)
logging.basicConfig(level=logging.INFO)
logging.debug("これはデバッグ用(表示されません)")
logging.info("アプリが起動しました")
logging.warning("設定ファイルが見つかりません")
logging.error("ファイルの読み込みに失敗しました")
logging.critical("致命的なエラーが発生しました")
出力例:
INFO:root:アプリが起動しました
WARNING:root:設定ファイルが見つかりません
ERROR:root:ファイルの読み込みに失敗しました
CRITICAL:root:致命的なエラーが発生しました
ログレベルとは?
ログには「重要度」を表すレベルがあります。
| レベル | 意味 | 例 |
|---|---|---|
| DEBUG | 開発者向けの細かい情報 | 変数の値を追跡 |
| INFO | 通常の情報 | アプリが開始・終了 |
| WARNING | 注意すべき事象 | 設定ファイルなし |
| ERROR | エラー発生 | ファイル読込失敗 |
| CRITICAL | 致命的な問題 | システム停止級 |
logging.basicConfig(level=logging.INFO)
と設定すると、INFO以上(WARNING, ERROR, CRITICAL)が出力されます。
ログをファイルに出力
実践コード例
import logging
# ログをファイルに出力
logging.basicConfig(
filename='app.log', # 出力ファイル名
level=logging.DEBUG, # 全レベル出力
format='%(asctime)s [%(levelname)s] %(message)s', # 出力フォーマット
datefmt='%Y-%m-%d %H:%M:%S', # 日付形式
)
logging.info("アプリが起動しました")
logging.debug("デバッグ情報を記録中")
logging.error("ファイルが見つかりません")
app.log ファイルには以下の感じで出力されます。
2025-10-26 23:15:31 [INFO] アプリが起動しました
2025-10-26 23:15:31 [DEBUG] デバッグ情報を記録中
2025-10-26 23:15:31 [ERROR] ファイルが見つかりません
format(フォーマット指定)の基本
loggingでは、フォーマットを自由に設定できます。
| 記法 | 意味 | 例 |
|---|---|---|
%(asctime)s | 日時 | 2025-10-26 22:35:12 |
%(levelname)s | ログレベル | INFO, ERRORなど |
%(message)s | 実際のメッセージ | “処理が完了しました” |
%(filename)s | ファイル名 | main.py |
%(lineno)d | 行番号 | 42 |
たとえば👇のようにすると、より詳細なログになります。
logging.basicConfig(
format='%(asctime)s [%(levelname)s] (%(filename)s:%(lineno)d) → %(message)s'
)
複数の出力先(コンソール+ファイル)
import logging
# ロガー作成
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# ハンドラ設定(ファイルとコンソール)
file_handler = logging.FileHandler('apptest.log')
stream_handler = logging.StreamHandler()
# フォーマット設定
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
# ハンドラをロガーに追加
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
# ログ出力
logger.info("アプリ起動")
logger.warning("設定ファイルが存在しません")
このようにすれば、画面にも出力され、同時にファイルにも保存されます!
よくある質問(FAQ)
❓ Q1. print() ではダメなの?
→ 小規模スクリプトならOKですが、規模が大きくなると「何がいつ起きたか」が分からなくなります。
loggingなら時間・レベル・行番号も残せるため、トラブル解析が格段に楽になります。
❓ Q2. ログファイルが大きくなったら?
→ logging.handlers.RotatingFileHandler を使えば、自動でローテーションできます。
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=100000, backupCount=3)
❓ Q3. 複数モジュールで共有したい
→ getLogger(__name__) を使うと、モジュールごとに独立したロガーを持てます。
まとめ
✅ print()よりも柔軟で便利
✅ ログレベルで重要度を管理
✅ ファイル出力やフォーマット指定も簡単
✅ 運用時のトラブル調査にも役立つ
おすすめ教材・ツール紹介
アプリ開発を初めて行う方におすすめな教材・書籍・ツールを紹介します。
おすすめ書籍
👉 Pythonでつくるデスクトップアプリ(Amazon)
アプリ開発を優しく紹介しています。loggingモジュールを使用することでよりレベルが上がると思います。
Python環境構築ツール
👉 Anaconda(公式サイト)
loggingを学ぶ際も、AnacondaのJupyter Notebookで試すと理解が早いです。
ディタおすすめ
👉 Visual Studio Code
拡張機能「Python」+「Log File Highlighter」を入れると、ログの色分けが超便利!
まとめ:loggingは初心者の次の一歩
loggingを覚えると、コードの信頼性・トラブル対応力が一気に向上します。
「動く」から「管理できる」プログラムへ進化させる第一歩です。
