内部出力と外部出力のlogging
5,000行規模のシステムになると、**「エラーが起きたこと」を開発者がリアルタイムで把握し、後から原因を調査できる仕組み**が不可欠です。
一般的には、「ローカルに保存するログ」**と「外部に通知する監視ツール」**の2段階で構成します。
1. ログ出力(Logging)の基本設定¶
Python標準の logging ライブラリを使い、レベル(情報の重要度)に応じて出力先や内容を制御します。
推奨されるログ設定の例¶
Python
import logging
# 1. ロガーの設定
logger = logging.getLogger("app_logger")
logger.setLevel(logging.INFO)
# 2. 出力形式(フォーマット)の定義
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 3. ファイル出力用ハンドラ(日ごとにファイルを分ける設定が一般的)
file_handler = logging.FileHandler("app.log")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# 使用例
logger.info("ユーザーがログインしました: user_id=123")
logger.error("データベースへの接続に失敗しました")
2. 外部監視ツール(Sentry)の導入¶
ログファイルは「後から見に行く」ものですが、Sentryのようなツールは**「エラーが起きた瞬間に開発者に通知」**してくれます。
なぜSentryを使うのか?¶
- 詳細な文脈(Context): エラー時の変数の中身、ブラウザの種類、実行していた関数の履歴がすべて記録されます。
- 集約機能: 同じエラーが100回起きても、1つの「課題」としてまとめてくれます。
- Slack連携: エラー発生時に即座にSlack通知を送れます。
Python(FastAPI)への導入例¶
Python
import sentry_sdk
from sentry_sdk.integrations.fastapi import FastApiIntegration
sentry_sdk.init(
dsn="https://your-sentry-id@sentry.io/project-id",
integrations=[FastApiIntegration()],
# エラーだけでなくパフォーマンスも監視する場合
traces_sample_rate=1.0,
)
3. エラー発生時にSlackへ通知する方法¶
Sentryを使わずに、自前でSlack通知を送る「通知用ユーティリティ」を作ることもよくあります。前述のディレクトリ構成にあった utils/notifier.py に実装するイメージです。
Python
import requests
def send_slack_notification(message: str):
webhook_url = "https://hooks.slack.com/services/Txxx/Bxxx/Xxxx"
payload = {
"text": f":warning: *システムエラー発生*\n{message}",
"username": "Error-Bot",
"icon_emoji": ":fire:"
}
try:
requests.post(webhook_url, json=payload, timeout=5)
except Exception as e:
logger.error(f"Slack通知に失敗しました: {e}")
4. 5,000行規模での運用ポイント¶
- ログの肥大化に注意: 何でもかんでもログに出すとディスク容量を圧迫します。
INFO(通常時)とDEBUG(開発時)を使い分けましょう。 - 機密情報を出さない: ログにユーザーのパスワードやクレジットカード番号が含まれないよう、バリデーションやフィルターをかけます。
- エラーの優先順位付け: 全てのエラーでSlackを鳴らすと「オオカミ少年」状態になります。重大なエラー(
CRITICAL)のみ通知する設定が理想的です。
次のステップへの提案¶
ログと監視の設定ができれば、システムの安定性は格段に上がります。
次は、これらすべての要素(要件定義、ディレクトリ構成、バリデーション、エラーハンドリング)を形にするための**「開発環境の構築(Dockerなど)」や、「チームで開発するためのGitの使い分け」**について詳しく知りたいですか?