【Python入門】printより便利なログ出力、loggingの基本と実践

Python

こんにちは!今回は、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("設定ファイルが存在しません")

このようにすれば、画面にも出力され、同時にファイルにも保存されます!

共通ログ設定ファイルを作成

ログ設定を関数化した共通モジュールにすると、他の Python プログラムでも使い回せるので作成しました。

ファイル名例:

logger_config.py

プログラム:

import logging


def setup_logger(
    name: str,
    log_file: str = "apptest.log",
    level: int = logging.INFO
) -> logging.Logger:
    """
    共通ロガーを作成する関数

    Parameters
    ----------
    name : str
        ロガー名。通常は __name__ を渡す。
    log_file : str
        出力するログファイル名。
    level : int
        ログレベル。logging.INFO, logging.DEBUG など。

    Returns
    -------
    logging.Logger
        設定済みのロガー
    """

    # ロガー作成
    logger = logging.getLogger(name)
    logger.setLevel(level)

    # すでにハンドラが設定されている場合は追加しない
    # 同じログが重複出力されるのを防ぐ
    if logger.handlers:
        return logger

    # ハンドラ設定
    file_handler = logging.FileHandler(log_file, encoding="utf-8")
    stream_handler = logging.StreamHandler()

    # ハンドラごとのログレベル設定
    file_handler.setLevel(level)
    stream_handler.setLevel(level)

    # フォーマット設定
    formatter = logging.Formatter(
        "%(asctime)s [%(levelname)s] %(name)s - %(message)s"
    )

    file_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)

    # ハンドラをロガーに追加
    logger.addHandler(file_handler)
    logger.addHandler(stream_handler)

    return logger

【使用方法】他の Python ファイルで使う

例:

from logger_config import setup_logger

# ロガー作成
logger = setup_logger(__name__)

# ログ出力
logger.info("アプリ起動")
logger.warning("設定ファイルが存在しません")
logger.error("エラーが発生しました")

【使用方法】ログファイル名を変えたい場合

from logger_config import setup_logger

logger = setup_logger(
    __name__,
    log_file="my_app.log"
)

logger.info("my_app.log に出力されます")

【使用方法】DEBUGログも出したい場合

import logging
from logger_config import setup_logger

logger = setup_logger(
    __name__,
    log_file="debug.log",
    level=logging.DEBUG
)

logger.debug("デバッグ情報")
logger.info("通常ログ")
logger.warning("警告ログ")

これで、他の Python プログラムでも logger_config.py を置いて setup_logger() を呼ぶだけで、同じログ設定を使い回せます。

よくある質問(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を覚えると、コードの信頼性・トラブル対応力が一気に向上します。
「動く」から「管理できる」プログラムへ進化させる第一歩です。

タイトルとURLをコピーしました