loggingのサンプル
5,000行規模のプロジェクトで実用的な、**「ログ専用フォルダの自動作成」と「日付付きファイル名」**に対応した本格的なPythonのサンプルコードを紹介します。
この構成では、標準ライブラリの logging.handlers.TimedRotatingFileHandler を使用するのが一般的です。これを使うと、日付が変わるタイミングで自動的に古いログをリネームし、新しいファイルを作ってくれます。
1. ログ設定のサンプルコード¶
このコードは、プロジェクトの初期化(main.py や config.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:
TimedRotatingFileHandlerのbackupCount=30は、古いログを30日分残して、それより古いものは自動削除するという意味です。これでサーバーの容量パンクを防げます。 - 一元化: 5,000行規模なら、
setup_logger()で作成したloggerインスタンスを、各モジュールでimportして使うのが最も効率的です。
次のステップへの提案¶
ログが出力できるようになったら、次は**「エラーが起きた際、そのログをどのように検索・分析するか」**が重要になります。
もしよろしければ、「Linuxコマンド(grepなど)を使ったログ調査の基本」**や、さらに高度な「複数サーバーのログを1ヶ所で見る仕組み(ELKスタックなど)」**について紹介しましょうか?