logging-best-practices について
logging-best-practicesは、ソフトウェア開発者向けの安全で構造化されたロギングのガイドです。ログレベル、リクエストコンテキスト、個人情報のマスキングや、複数言語・可観測性システムの実装例を扱います。
主な機能
- 01ログレベルの指針
- 02構造化JSONログ
- 03リクエストコンテキストと相関ID
- 04個人情報のマスキング
- 05言語別の実装リファレンス
活用シーン
- 01アプリケーションへの構造化ログの導入
- 02サービス間イベントの関連付け
- 03ログ内の機密情報のマスキング
- 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 を使用する
- 処理頻度の高いループ内でログを記録する
- クライアントエラーにスタックトレースを含める
コメント
Markdown 対応