| name | log-design |
| description | ログ設計の妥当性チェック。一般的なログ基準と日本国内法的要件(電子帳簿保存法・個人情報保護法等)に基づき、ログ設計・実装を検証する。 |
Log Design Check - ログ設計チェック
プロジェクトのログ設計が一般的な基準と法的要件を満たしているか体系的にチェックし、不足があれば実装パターンを提示する。
参照: セキュリティ関連のログルールは documents/development/coding-rules/common-rules.md Section 4 も併せて確認すること。
実行フロー
Step 1: 現状分析(既存のログ設定・出力を確認)
↓
Step 2: 一般的ログ基準チェック
↓
Step 3: 法的要件チェック
↓
Step 4: 不足箇所の実装パターン提示
↓
Step 5: レポート出力
Step 1: 現状分析
以下を確認する:
- ログライブラリ・設定ファイル(logback-spring.xml、pino設定等)
- 既存のログ出力箇所
- 取り扱うデータの種類(取引データ、個人情報、メール送信等)
Step 2: 一般的ログ基準チェック
ログレベル基準
| レベル | 用途 | 例 |
|---|
| ERROR | システム異常、復旧不可能なエラー | DB接続失敗、外部API障害、未処理例外 |
| WARN | 想定内だが注意が必要な事象 | リトライ発生、閾値超過、非推奨API使用 |
| INFO | ビジネス上重要なイベント | ユーザーログイン/ログアウト、決済完了、重要な状態遷移 |
| DEBUG | 開発・調査用の詳細情報 | リクエスト/レスポンス詳細、SQL実行詳細(本番では無効化) |
構造化ログ実装パターン
Spring Boot + Logback (JSON形式):
@Slf4j
@Service
public class PaymentService {
public void completePayment(Payment payment) {
MDC.put("action", "PAYMENT_COMPLETE");
MDC.put("paymentId", payment.getId().toString());
log.info("Payment completed: amount={}", payment.getAmount());
MDC.clear();
}
}
Next.js (API Routes / Server Actions):
import pino from 'pino';
export const logger = pino({
level: process.env.LOG_LEVEL || 'info',
formatters: {
level: (label) => ({ level: label }),
},
timestamp: pino.stdTimeFunctions.isoTime,
});
export async function POST(request: Request) {
const body = await request.json();
logger.info(
{ action: 'ORDER_CREATED', orderId: body.id, userId: session.userId },
'Order created'
);
}
機密情報マスキングパターン
ログに出力してはいけない情報:
- パスワード、トークン、APIキー
- クレジットカード番号(PCI DSS)
- マイナンバー(個人番号)
マスキング実装例 (Java):
public class PiiMasker {
public static String maskEmail(String email) {
if (email == null) return "***";
int atIndex = email.indexOf('@');
if (atIndex < 0) return "***";
if (atIndex <= 1) return "***@" + email.substring(atIndex + 1);
return email.charAt(0) + "***@" + email.substring(atIndex + 1);
}
public static String maskPhone(String phone) {
if (phone == null || phone.length() < 4) return "****";
return "****" + phone.substring(phone.length() - 4);
}
public static String maskCardNumber(String cardNumber) {
if (cardNumber == null) return "****";
String digits = cardNumber.replaceAll("[^0-9]", "");
if (digits.length() < 4) return "****";
return "****-****-****-" + digits.substring(digits.length() - 4);
}
public static String maskMyNumber(String myNumber) {
if (myNumber == null) return "************";
return "************";
}
}
ログインジェクション防止
ユーザー入力をログ出力する際、改行コード(CR/LF)を含む文字列がそのまま出力されると、偽のログ行が挿入される(ログインジェクション/ログフォージング)。監査ログの信頼性を損なうため、必ずサニタイズする。
public static String sanitizeForLog(String input) {
if (input == null) return "";
return input.replaceAll("[\\r\\n]", " ");
}
log.info("User search: query={}", sanitizeForLog(userInput));
function sanitizeForLog(input: string): string {
return input.replace(/[\r\n]/g, ' ');
}
フロントエンド (Server-side only):
必須ログ出力ポイント
| カテゴリ | ログ対象 | レベル |
|---|
| 認証 | ログイン成功/失敗、ログアウト、トークンリフレッシュ | INFO |
| 認可 | 権限不足によるアクセス拒否 | WARN |
| データ変更 | 重要データのCRUD操作(誰が・いつ・何を) | INFO |
| 決済 | 決済開始・完了・失敗 | INFO/ERROR |
| 外部連携 | 外部API呼び出し(リクエスト/レスポンス概要) | INFO |
| エラー | 未処理例外、システム障害 | ERROR |
Step 3: 法的要件チェック
電子帳簿保存法(電子取引データ保存)
該当条件: 電子的に授受した取引情報(注文書、請求書、領収書、見積書等に相当するデータ)を扱う場合
チェックリスト:
監査ログ実装パターン:
@Aspect
@Component
@RequiredArgsConstructor
public class AuditLogAspect {
private final AuditLogRepository auditLogRepository;
@AfterReturning("@annotation(Auditable)")
public void logAudit(JoinPoint joinPoint) {
}
}
@Auditable
@Transactional
public OrderResponse createOrder(CreateOrderRequest request) {
}
個人情報保護法
該当条件: 個人情報(氏名、メールアドレス、住所、電話番号等)を取り扱う場合
チェックリスト:
個人情報アクセスログ実装パターン:
log.info("Personal data accessed: entity={}, entityId={}, fields={}, actor={}",
"Student", studentId, "name,email,phone", currentUserId);
特定電子メール法
該当条件: 広告・宣伝目的の電子メールを送信する場合
チェックリスト:
Step 4: 実装パターン提示
チェック結果に基づき、不足箇所について上記の実装パターンをプロジェクトのスタックに合わせて提示する。
Step 5: レポート出力
チェック結果をMarkdownチェックリスト形式でコンソールに出力する:
## Log Design Check Report
### 一般的ログ基準
- [x] ログレベル基準が定義されている
- [ ] 構造化ログが導入されていない -> 実装パターンを提示
- [x] 機密情報マスキングが実装されている
### 法的要件(電子帳簿保存法)
- [x] 該当: 取引データを扱う
- [ ] タイムスタンプ要件: 未対応 -> 実装パターンを提示
- [x] 改ざん防止: 監査ログ実装済み
### 法的要件(個人情報保護法)
- [x] 該当: 個人情報を扱う
- [x] マスキング: 実装済み
- [ ] アクセスログ: 未実装 -> 実装パターンを提示
### 法的要件(特定電子メール法)
- [ ] 非該当(メール送信機能なし)
### Summary
- チェック項目: 12件
- 対応済み: 8件
- 要対応: 4件(実装パターン提示済み)