mcpField
L
logging-best-practices

logging-best-practices

github.com/secondsky開発240401 回インストール5 週間前に更新
リポジトリ

logging-best-practices について

logging-best-practicesは、ソフトウェア開発者向けの安全で構造化されたロギングのガイドです。ログレベル、リクエストコンテキスト、個人情報のマスキングや、複数言語・可観測性システムの実装例を扱います。

主な機能

  1. 01ログレベルの指針
  2. 02構造化JSONログ
  3. 03リクエストコンテキストと相関ID
  4. 04個人情報のマスキング
  5. 05言語別の実装リファレンス

活用シーン

  1. 01アプリケーションへの構造化ログの導入
  2. 02サービス間イベントの関連付け
  3. 03ログ内の機密情報のマスキング
  4. 04本番環境のロギング方針の策定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/secondsky/claude-skills --skill logging-best-practices

インストール後、Claude Code で/logging-best-practicesを入力して読み込まれたか確認します。

同梱ファイルreferences/advanced-logging.md

詳細

ロギングのベストプラクティス

適切なレベルとコンテキストを使用して、安全で構造化されたロギングを実装します。

ログレベル

レベル用途本番環境
DEBUG詳細なデバッグオフ
INFO通常の操作オン
WARN潜在的な問題オン
ERROR復旧可能なエラーオン
FATAL致命的な障害オン

構造化ロギング(Winston)

const winston = require('winston');

const logger = winston.createLogger({
  level: process.env.LOG_LEVEL || 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  defaultMeta: { service: 'api-service' },
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'error.log', level: 'error' })
  ]
});

// Usage
logger.info('User logged in', { userId: '123', ip: '192.168.1.1' });
logger.error('Payment failed', { error: err.message, orderId: '456' });

リクエストコンテキスト

const { AsyncLocalStorage } = require('async_hooks');
const storage = new AsyncLocalStorage();

app.use((req, res, next) => {
  const context = {
    requestId: req.headers['x-request-id'] || uuid(),
    userId: req.user?.id
  };
  storage.run(context, next);
});

function log(level, message, meta = {}) {
  const context = storage.getStore() || {};
  logger.log(level, message, { ...context, ...meta });
}

PII のサニタイズ

const sensitiveFields = ['password', 'ssn', 'creditCard', 'token'];

function sanitize(obj) {
  const sanitized = { ...obj };
  for (const field of sensitiveFields) {
    if (sanitized[field]) sanitized[field] = '[REDACTED]';
  }
  if (sanitized.email) {
    sanitized.email = sanitized.email.replace(/(.{2}).*@/, '$1***@');
  }
  return sanitized;
}

ベストプラクティス

  • 構造化 JSON 形式を使用します
  • サービス間で相関 ID を含めます
  • ログに記録する前に、すべての PII をサニタイズします
  • パフォーマンス向上のために非同期ロギングを使用します
  • ログローテーションを実装します
  • 本番環境では DEBUG レベルでログを記録しないでください

その他の実装

以下を参照してください:references/advanced-logging.md

  • Python structlog のセットアップ
  • Go zap による高性能ロギング
  • ELK Stack の統合
  • AWS CloudWatch の設定
  • OpenTelemetry トレーシング

絶対に避けること

  • パスワードやトークンをログに記録する
  • 本番環境で console.log を使用する
  • 処理頻度の高いループ内でログを記録する
  • クライアントエラーにスタックトレースを含める

コメント