Skip to content
閲覧中:
loggingのサンプル

loggingのサンプル

5,000行規模のプロジェクトで実用的な、**「ログ専用フォルダの自動作成」と「日付付きファイル名」**に対応した本格的なPythonのサンプルコードを紹介します。

この構成では、標準ライブラリの logging.handlers.TimedRotatingFileHandler を使用するのが一般的です。これを使うと、日付が変わるタイミングで自動的に古いログをリネームし、新しいファイルを作ってくれます。


1. ログ設定のサンプルコード

このコードは、プロジェクトの初期化(main.pyconfig.py)で一度呼び出すだけで準備が整います。

Python
import logging
import os
from logging.handlers import TimedRotatingFileHandler
from datetime import datetime

def setup_logger():
    # 1. ログ用フォルダの作成 (プロジェクト直下の 'logs' フォルダ)
    log_dir = "logs"
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # 2. ロガーの生成
    logger = logging.getLogger("AppLogger")
    logger.setLevel(logging.DEBUG)  # DEBUG以上の全ログを拾う

    # 3. ログの出力フォーマット
    # [日時] [レベル] [ファイル名:行数] メッセージ
    formatter = logging.Formatter(
        '[%(asctime)s] %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s'
    )

    # 4. 日付でローテーションするハンドラの設定
    # app_2025-12-19.log のようなファイルが作成される
    current_date = datetime.now().strftime("%Y-%m-%d")
    log_file = os.path.join(log_dir, f"app_{current_date}.log")

    file_handler = TimedRotatingFileHandler(
        log_file, when="midnight", interval=1, backupCount=30, encoding="utf-8"
    )
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

    # コンソール(ターミナル)にも出力する場合の設定
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

    return logger

# ロガーの起動
logger = setup_logger()

2. ログの書き込みと出力例

各レベル(DEBUG, INFO, WARNING, ERROR, CRITICAL)で書き込んだ際、実際にファイルにどう記録されるかを見てみましょう。

書き込みコード

Python
# 様々なレベルでのログ記録
logger.debug("データベースのクエリを実行中: SELECT * FROM items")
logger.info("ユーザー 'tanaka' がログインに成功しました。")
logger.warning("ディスク容量が残り10%以下です。")
logger.error("API連携に失敗しました。ステータスコード: 500")
logger.critical("致命的なエラー: データベースサーバーに接続できません。システムを停止します。")

実際のログファイルの中身 (logs/app_2025-12-19.log)

Text Only
[2025-12-19 10:00:01] DEBUG    [main.py:45] データベースのクエリを実行中: SELECT * FROM items
[2025-12-19 10:05:22] INFO     [auth.py:12] ユーザー 'tanaka' がログインに成功しました。
[2025-12-19 10:10:45] WARNING  [system.py:88] ディスク容量が残り10%以下です。
[2025-12-19 10:15:30] ERROR    [api.py:34] API連携に失敗しました。ステータスコード: 500
[2025-12-19 10:15:31] CRITICAL [main.py:102] 致命的なエラー: データベースサーバーに接続できません。システムを停止します。

3. ログ運用のポイント

  • レベルの使い分け:
  • DEBUG: 開発者のみが必要な細かい動き(変数の値など)。本番環境ではオフにすることもあります。
  • INFO: 「誰が何をした」という正常な履歴。
  • WARNING: すぐには壊れないが、放置するとマズい状態。

  • backupCount: TimedRotatingFileHandlerbackupCount=30 は、古いログを30日分残して、それより古いものは自動削除するという意味です。これでサーバーの容量パンクを防げます。

  • 一元化: 5,000行規模なら、setup_logger() で作成した logger インスタンスを、各モジュールで import して使うのが最も効率的です。

次のステップへの提案

ログが出力できるようになったら、次は**「エラーが起きた際、そのログをどのように検索・分析するか」**が重要になります。

もしよろしければ、「Linuxコマンド(grepなど)を使ったログ調査の基本」**や、さらに高度な「複数サーバーのログを1ヶ所で見る仕組み(ELKスタックなど)」**について紹介しましょうか?