# 機能設計書 119-Get-DbaErrorLog

## 概要

本ドキュメントは、SQL Serverエラーログエントリを取得するための機能設計書である。トラブルシューティング、監視、コンプライアンス監査に必要なエラーログ情報を効率的に取得する。

### 本機能の処理概要

**業務上の目的・背景**：SQL Serverエラーログは、サーバーの健全性、ログイン失敗、システムイベント、エラー情報を記録する重要な診断リソースである。トラブルシューティング時には複数のログファイルを横断して検索する必要があり、手動での確認は時間がかかる。本機能は、複数のログファイルを一括で検索し、ソース、テキストパターン、日付範囲でフィルタリングする機能を提供する。

**機能の利用シーン**：
- SQL Server問題のトラブルシューティング
- ログイン失敗の監視と調査
- システムイベントの追跡
- コンプライアンス監査のためのログ分析
- デプロイ後の問題確認

**主要な処理内容**：
1. 対象SQL Serverインスタンスへ接続
2. SMOのReadErrorLogメソッドを使用してエラーログを読み取り
3. LogNumber、Source、Text、After、Beforeパラメータでフィルタリング
4. 各エントリに接続情報を付加して返却

**関連システム・外部連携**：SMOのServer.ReadErrorLogメソッドを使用。

**権限による制御**：エラーログ読み取り権限が必要（通常はsysadminまたはserveradmin）。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | PowerShellコマンドラインインターフェースのみ |

## 機能種別

データ参照 / ログ取得

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス（パイプライン可） | 接続可能なインスタンス名 |
| SqlCredential | PSCredential | No | 代替認証資格情報 | 有効なWindows/SQL認証資格情報 |
| LogNumber | int[] | No | 読み取るログファイル番号（0-99、0=現在のログ） | 0-99の範囲 |
| Source | object[] | No | フィルタするソース名（Logon、Server、Backup等） | - |
| Text | string | No | ログエントリ内で検索するテキストパターン（ワイルドカード対応） | - |
| After | datetime | No | この日時以降のエントリのみ取得 | 有効なdatetime |
| Before | datetime | No | この日時以前のエントリのみ取得 | 有効なdatetime |
| EnableException | switch | No | 例外を発生させるかどうか | - |

### 入力データソース

- SqlInstanceパラメータ: ユーザー入力またはパイプライン

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | SQL Serverサービス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| LogDate | datetime | ログエントリの作成日時 |
| Source | string | ログエントリのソース（ProcessInfo のエイリアス） |
| Text | string | ログエントリのテキスト内容 |

### 出力先

- PowerShellパイプライン（標準出力）
- Microsoft.SqlServer.Management.Smo.LogFileEntry オブジェクトとして返却

## 処理フロー

### 処理シーケンス

```
1. processブロック開始
   └─ 各SqlInstanceについてループ処理
      ├─ 1.1 Connect-DbaInstance で接続
      ├─ 1.2 LogNumber未指定時は99..0を設定（全ログ読み取り）
      └─ 1.3 各LogNumberについてループ処理
             ├─ $server.ReadErrorLog($number) でログ読み取り
             ├─ Source、Text、After、Beforeフィルタ適用
             ├─ Add-Member で接続情報を付加
             └─ Select-DefaultView で出力
2. エラー処理
   └─ 接続失敗時は Stop-Function で次のインスタンスへ
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstanceをループ}
    B --> C[Connect-DbaInstance]
    C --> D{接続成功?}
    D -->|No| E[Stop-Function]
    E --> B
    D -->|Yes| F{LogNumber指定?}
    F -->|No| G[LogNumber = 99..0]
    F -->|Yes| H[指定されたLogNumber使用]
    G --> I{各LogNumberをループ}
    H --> I
    I --> J[ReadErrorLog実行]
    J --> K{各エントリをループ}
    K --> L{Sourceフィルタ?}
    L -->|Match| M{Textフィルタ?}
    L -->|No Match| K
    M -->|Match| N{Afterフィルタ?}
    M -->|No Match| K
    N -->|Match| O{Beforeフィルタ?}
    N -->|No Match| K
    O -->|Match| P[Add-Member]
    O -->|No Match| K
    P --> Q[Select-DefaultView]
    Q --> K
    K --> I
    I --> B
    B --> R[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | デフォルト全ログ | LogNumber未指定時は99から0まで全ログを読み取り | LogNumber未指定時 |
| BR-002 | 逆順読み取り | 99から0の順で読み取り（新しいログ優先） | 常時 |
| BR-003 | ワイルドカードText | Textパラメータは*ワイルドカードをサポート | Text指定時 |
| BR-004 | 複合フィルタ | Source、Text、After、Beforeは組み合わせ可能 | フィルタ指定時 |

### 計算ロジック

特になし。ログ読み取りとフィルタリングのみ。

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| エラーログ読み取り | - | SMOメソッド | ReadErrorLogでログファイルを読み取り |

### テーブル別操作詳細

SMO Server.ReadErrorLog() メソッドがエラーログファイルを読み取る。直接的なテーブル操作はない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ConnectionError | SQL Server接続失敗 | Stop-Function でエラー出力、次のインスタンスへ |

### リトライ仕様

リトライ処理は実装されていない。接続エラー時は当該インスタンスをスキップして次を処理。

## トランザクション仕様

読み取り専用操作のため、トランザクション管理は不要。

## パフォーマンス要件

- 存在しないログ番号の読み取りは高速（スキップ）
- 大きなログファイルは読み取りに時間がかかる可能性
- フィルタはクライアント側で適用（サーバー負荷は最小）

## セキュリティ考慮事項

- エラーログ読み取り権限が必要
- ログにはセキュリティ関連情報（ログイン失敗等）が含まれる
- SQL認証使用時は資格情報の安全な管理が必要

## 備考

- SQL Serverはデフォルトで6つのログファイルを保持（最大99まで設定可能）
- ログ0は現在のアクティブログ
- サービス再起動時にログがローテーションされる
- ReadErrorLogの制限により、ログ内の順序は古い→新しい

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本機能ではSMO LogFileEntryオブジェクトを出力する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | 出力型（60行目: .OUTPUTS）とSelect-DefaultView（155行目） |

**読解のコツ**: Add-Memberで接続情報を付加し、Select-DefaultViewでProcessInfoをSourceにエイリアス。

#### Step 2: LogNumber処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | LogNumber設定（140-142行目） |

**主要処理フロー**:
- **140-142行目**: LogNumber未指定時は99..0を設定
- **144行目**: foreach ($number in $lognumber) でループ

#### Step 3: フィルタリングロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | フィルタ条件（145-148行目） |

**主要処理フロー**:
- **145行目**: ReadErrorLog実行
- **146行目**: 複合条件でフィルタ（Source、Text、After、Before）
- **147行目**: continueでスキップ

### プログラム呼び出し階層図

```
Get-DbaErrorLog
    │
    ├─ Connect-DbaInstance
    │
    └─ foreach ($number in $lognumber)
           │
           ├─ $server.ReadErrorLog($number)
           │      └─ SMO LogFileEntry オブジェクト
           │
           ├─ フィルタ適用
           │      ├─ Source チェック
           │      ├─ Text ワイルドカードマッチ
           │      ├─ After 日時比較
           │      └─ Before 日時比較
           │
           ├─ Add-Member
           │      ├─ ComputerName
           │      ├─ InstanceName
           │      └─ SqlInstance
           │
           └─ Select-DefaultView
                  └─ ProcessInfo as Source
```

### データフロー図

```
[入力]                    [処理]                              [出力]

SqlInstance ───────▶ Connect-DbaInstance ───▶ $server

LogNumber ──────────┬── 指定あり ──────────▶ 指定値使用
                    │
                    └── 未指定 ──────────▶ 99..0

foreach (LogNumber)
        │
        ▼
$server.ReadErrorLog($number)
        │
        ▼
LogFileEntry オブジェクト
        │
        ▼
フィルタ適用
├─ Source != $Source? → スキップ
├─ Text notlike "*$Text*"? → スキップ
├─ LogDate -lt $After? → スキップ
└─ LogDate -gt $Before? → スキップ
        │
        ▼
Add-Member (接続情報)
        │
        ▼
Select-DefaultView ───▶ パイプライン出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | ソース | メイン関数の実装 |
| Get-DbaErrorLogConfig.ps1 | `public/Get-DbaErrorLogConfig.ps1` | ソース | 関連機能：エラーログ設定取得 |
| Set-DbaErrorLogConfig.ps1 | `public/Set-DbaErrorLogConfig.ps1` | ソース | 関連機能：エラーログ設定変更 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続機能 |
