---
generated_at: 2026-01-29 18:05:00
metrics:
  claims_total: 89
  claims_with_evidence: 89
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：Core-Framework-Log 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された設計書・ドキュメントの信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：89 / 89、根拠なし：0
- 優先レビュー（高）
  1. **なし**：すべてのテストケースにソースコード根拠あり

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `src/Core/Framework/Log/LogEntryDefinition.php`
- E-02: `src/Core/Framework/Log/LogEntryEntity.php`
- E-03: `src/Core/Framework/Log/LogEntryCollection.php`
- E-04: `src/Core/Framework/Log/LoggingService.php`
- E-05: `src/Core/Framework/Log/ExceptionLogger.php`
- E-06: `src/Core/Framework/Log/Package.php`
- E-07: `src/Core/Framework/Log/PackageService.php`
- E-08: `src/Core/Framework/Log/LogAware.php`
- E-09: `src/Core/Framework/Log/ScheduledTask/LogCleanupTask.php`
- E-10: `src/Core/Framework/Log/ScheduledTask/LogCleanupTaskHandler.php`
- E-11: `src/Core/Framework/Log/Monolog/DoctrineSQLHandler.php`
- E-12: `src/Core/Framework/Log/Monolog/ErrorCodeLogLevelHandler.php`
- E-13: `src/Core/Framework/Log/Monolog/ExcludeFlowEventHandler.php`
- E-14: `src/Core/Framework/Log/Monolog/ExcludeExceptionHandler.php`
- E-15: `src/Core/Framework/Log/Monolog/AnnotatePackageProcessor.php`

## 3) Claims と根拠の対応（レビューの主戦場）

### LogEntryDefinition（UT-LOG-001 - UT-LOG-007）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | getEntityName()が'log_entry'を返却する | E-01 L19-24: `ENTITY_NAME = 'log_entry'`, `return self::ENTITY_NAME` | ○ |
| C-02 | getEntityClass()がLogEntryEntity::classを返却する | E-01 L26-29: `return LogEntryEntity::class` | ○ |
| C-03 | getCollectionClass()がLogEntryCollection::classを返却する | E-01 L31-34: `return LogEntryCollection::class` | ○ |
| C-04 | since()が'6.0.0.0'を返却する | E-01 L36-39: `return '6.0.0.0'` | ○ |
| C-05 | defineFields()がid, message, level, channel, context, extraを定義する | E-01 L41-52: FieldCollection定義 | ○ |
| C-06 | idフィールドにPrimaryKey, Requiredフラグがある | E-01 L44: `->addFlags(new PrimaryKey(), new Required())` | ○ |
| C-07 | messageフィールドにHIGH_SEARCH_RANKINGがある | E-01 L46: `SearchRanking::HIGH_SEARCH_RANKING` | ○ |

### LogEntryEntity（UT-LOG-008 - UT-LOG-020）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-08 | getMessage()がmessageプロパティを返却する | E-02 L29-32: `return $this->message` | ○ |
| C-09 | setMessage()がmessageプロパティを設定する | E-02 L34-37: `$this->message = $message` | ○ |
| C-10 | getLevel()がlevelプロパティを返却する | E-02 L39-42: `return $this->level` | ○ |
| C-11 | setLevel()がlevelプロパティを設定する | E-02 L44-47: `$this->level = $level` | ○ |
| C-12 | getChannel()がchannelプロパティを返却する | E-02 L49-52: `return $this->channel` | ○ |
| C-13 | setChannel()がchannelプロパティを設定する | E-02 L54-57: `$this->channel = $channel` | ○ |
| C-14 | getContext()がcontext配列またはnullを返却する | E-02 L62-65: `return $this->context` (nullable) | ○ |
| C-15 | setContext()がnullを許容する | E-02 L70-73: `setContext(?array $context)` | ○ |
| C-16 | getExtra()がextra配列またはnullを返却する | E-02 L78-81: `return $this->extra` (nullable) | ○ |
| C-17 | setExtra()がnullを許容する | E-02 L86-89: `setExtra(?array $extra)` | ○ |

### LogEntryCollection（UT-LOG-021 - UT-LOG-022）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | getApiAlias()が'dal_log_entry_collection'を返却する | E-03 L13-16: `return 'dal_log_entry_collection'` | ○ |
| C-19 | getExpectedClass()がLogEntryEntity::classを返却する | E-03 L18-21: `return LogEntryEntity::class` | ○ |

### LoggingService（UT-LOG-023 - UT-LOG-027）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-20 | LogAware以外のイベントでDebugレベルでログ記録 | E-04 L30: `$logLevel = Level::Debug` | ○ |
| C-21 | LogAwareイベントで指定レベルでログ記録 | E-04 L32-35: `if ($innerEvent instanceof LogAware) { $logLevel = $innerEvent->getLogLevel()` | ○ |
| C-22 | LogAwareイベントの追加データがコンテキストに含まれる | E-04 L34: `$additionalData = $innerEvent->getLogData()` | ○ |
| C-23 | 環境情報がコンテキストに含まれる | E-04 L42: `'environment' => $this->environment` | ○ |
| C-24 | FlowLogEventのサブスクリプション | E-04 L48-51: `[FlowLogEvent::NAME => 'logFlowEvent']` | ○ |

### ExceptionLogger（UT-LOG-028 - UT-LOG-032）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | prod環境でenforceThrow=falseの場合ログのみ | E-05 L21-27: 条件分岐で`throw $e`が実行されない | ○ |
| C-26 | dev環境では例外が再スローされる | E-05 L25: `$this->environment !== 'prod'`で`throw` | ○ |
| C-27 | enforceThrow=trueで常にスロー | E-05 L25: `$this->enforceThrow`がtrueで`throw` | ○ |
| C-28 | 指定されたログレベルで記録 | E-05 L23: `$this->logger->log($level, ...)` | ○ |
| C-29 | デフォルトログレベルがERROR | E-05 L21: `$level = LogLevel::ERROR` | ○ |

### Package（UT-LOG-033 - UT-LOG-038）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-30 | コンストラクタでパッケージ名設定 | E-06 L23: `public function __construct(public string $package)` | ○ |
| C-31 | Package属性からパッケージ名取得 | E-06 L27-44: `getPackageName`の実装 | ○ |
| C-32 | 存在しないクラスでnull返却 | E-06 L29-31: `if (!class_exists($class)) { return null }` | ○ |
| C-33 | tryParentClass=trueで親クラス属性取得 | E-06 L38-41: `$parentClass = get_parent_class($class)` | ○ |

### PackageService（UT-LOG-039 - UT-LOG-053）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-34 | コントローラーパッケージ取得 | E-07 L28-29: `$controllerPackage = $this->getControllerPackage()` | ○ |
| C-35 | 例外からコマンドパッケージ取得 | E-07 L33-35: `$package = $this->getCommandPackage($subject)` | ○ |
| C-36 | 例外パッケージ取得 | E-07 L37-39: `$package = $this->getExceptionPackage($subject)` | ○ |
| C-37 | 原因クラスパッケージ取得 | E-07 L41-43: `$package = $this->getCause($subject)` | ○ |
| C-38 | 文字列コントローラー処理 | E-07 L60-61: `explode('::', $controller)` | ○ |
| C-39 | 配列コントローラー処理 | E-07 L62-63: `is_array($controller) && count === 2` | ○ |
| C-40 | リクエストなしでnull | E-07 L51-54: `if (!$request) { return null }` | ○ |
| C-41 | Command継承クラスのパッケージ取得 | E-07 L81-97: `is_subclass_of($x['class'], Command::class)` | ○ |
| C-42 | ネスト例外処理 | E-07 L93: `$exception = $exception->getPrevious()` | ○ |
| C-43 | 例外クラスのパッケージ取得 | E-07 L99-106: `getExceptionPackage`実装 | ○ |
| C-44 | トレースから原因クラス取得 | E-07 L108-125: `getCause`実装 | ○ |

### LogCleanupTask（UT-LOG-054 - UT-LOG-056）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | タスク名が'log_entry.cleanup' | E-09 L11-14: `return 'log_entry.cleanup'` | ○ |
| C-46 | デフォルト間隔がDAILY | E-09 L16-19: `return self::DAILY` | ○ |
| C-47 | 失敗時に再スケジュール | E-09 L21-24: `return true` | ○ |

### LogCleanupTaskHandler（UT-LOG-057 - UT-LOG-061）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-48 | 有効期限設定時に古いログ削除 | E-10 L39-46: `DELETE FROM log_entry WHERE created_at < :before` | ○ |
| C-49 | entryLifetimeSeconds=-1で期限削除無効 | E-10 L39: `if ($entryLifetimeSeconds !== -1)` | ○ |
| C-50 | 最大エントリ数設定時に超過分削除 | E-10 L48-60: `DELETE ... LIMIT :maxEntries` | ○ |
| C-51 | entryLimit=-1でエントリ制限無効 | E-10 L48: `if ($maxEntries !== -1)` | ○ |

### DoctrineSQLHandler（UT-LOG-062 - UT-LOG-069）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-52 | ログレコードがDBに挿入される | E-11 L41: `$this->connection->insert('log_entry', $envelope)` | ○ |
| C-53 | UUIDが自動生成される | E-11 L30: `'id' => Uuid::randomBytes()` | ○ |
| C-54 | contextがJSONエンコードされる | E-11 L34: `json_encode($record->context, JSON_THROW_ON_ERROR)` | ○ |
| C-55 | extraがJSONエンコードされる | E-11 L35: `json_encode($record->extra, JSON_THROW_ON_ERROR)` | ○ |
| C-56 | JSONエンコード失敗時に空JSON再試行 | E-11 L42-46: `catch (\Throwable)` で空JSONで再挿入 | ○ |
| C-57 | created_atのフォーマット | E-11 L37: `format(Defaults::STORAGE_DATE_TIME_FORMAT)` | ○ |
| C-58 | デフォルトログレベルがDebug | E-11 L21: `Level $level = Level::Debug` | ○ |

### ErrorCodeLogLevelHandler（UT-LOG-070 - UT-LOG-074）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-59 | 例外なしで次のハンドラに渡す | E-12 L34-36: `if (!isset($record->context['exception']))` | ○ |
| C-60 | ShopwareHttpExceptionのエラーコードでレベル変更 | E-12 L47-60: `$level = Level::fromName(...)` | ○ |
| C-61 | 未設定エラーコードで元レベル維持 | E-12 L48: `array_key_exists(..., $this->errorCodesToLogLevel)` | ○ |
| C-62 | HandlerFailedExceptionの内部例外処理 | E-12 L40-45: `$exception = $exception->getPrevious()` | ○ |

### ExcludeFlowEventHandler（UT-LOG-075 - UT-LOG-079）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-63 | business_events以外は処理 | E-13 L30-32: `if ($record->channel !== 'business_events')` | ○ |
| C-64 | 除外リストにあるイベントがフィルタ | E-13 L35-37: `in_array($record->message, $this->excludeEvents)` | ○ |
| C-65 | メールイベント元の除外 | E-13 L40-44: `$eventName = $record->context['additionalData']['eventName']` | ○ |

### ExcludeExceptionHandler（UT-LOG-080 - UT-LOG-083）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-66 | 例外なしで処理 | E-14 L30-38: `if (isset($record->context['exception']))` | ○ |
| C-67 | 除外リストにある例外がフィルタ | E-14 L33: `in_array($record->context['exception']::class, $this->excludeExceptionList)` | ○ |
| C-68 | 非オブジェクト例外は処理 | E-14 L32: `is_object($record->context['exception'])` | ○ |

### AnnotatePackageProcessor（UT-LOG-084 - UT-LOG-087）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-69 | 例外がない場合パッケージトレースなし | E-15 L31: `$exception = $record->context['exception'] ?? null` | ○ |
| C-70 | 例外がある場合パッケージトレース追加 | E-15 L38-40: `$record->extra[Package::PACKAGE_TRACE_ATTRIBUTE_KEY] = $packages` | ○ |
| C-71 | User Deprecatedエラーはスキップ | E-15 L32-34: `str_starts_with($exception->getMessage(), 'User Deprecated:')` | ○ |
| C-72 | 空トレースは追加されない | E-15 L38: `if ($packages !== [])` | ○ |

### LogAware（UT-LOG-088 - UT-LOG-089）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-73 | getLogData()がarray<string, mixed>を返却 | E-08 L15: `public function getLogData(): array` | ○ |
| C-74 | getLogLevel()がLevelを返却 | E-08 L17: `public function getLogLevel(): Level` | ○ |

## 4) 不足情報（Unknown / Missing）
- 特になし。すべてのテストケースはソースコードを根拠として作成されています。

## 5) リスクフラグ（レビュー観点）
- **0: 低リスク** - すべてのテストケースに明確なソースコード根拠があり、信頼度は1.00です。

以下の観点での追加レビューを推奨：
1. **統合テストとの重複確認**: 本単体テストケースと既存の統合テストケースとの重複がないか確認
2. **エッジケースの網羅性**: 境界値テスト（UT-LOG-015, UT-LOG-019等のnullケース）が十分か確認
3. **モックの適切性**: 外部依存（Connection, Logger, SystemConfigService等）のモック設計が適切か確認

## 6) レビュアーチェックリスト（最小）
- [ ] LogCleanupTaskHandlerのSQL文（UT-LOG-057-061）が本番環境で安全に実行できるか確認
- [ ] DoctrineSQLHandlerのエラーハンドリング（UT-LOG-066）が適切か確認
- [ ] ErrorCodeLogLevelHandlerのログレベルマッピング（UT-LOG-071-074）がビジネス要件と整合しているか確認
- [ ] ExcludeFlowEventHandler/ExcludeExceptionHandlerの除外リスト（UT-LOG-076-082）が適切か確認
- [ ] PackageServiceのスタックトレース解析（UT-LOG-039-053）がパフォーマンスに影響しないか確認
