# 画面設計書 108-エラーログ

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Serverのエラーログ管理機能（Get-DbaErrorLog、Get-DbaErrorLogConfig、Set-DbaErrorLogConfig、Invoke-DbaCycleErrorLog）の設計仕様を記載する。

### 本画面の処理概要

SQL Serverのエラーログを取得・検索し、エラーログの構成設定（保持数、サイズ）を管理し、ログのサイクル（ローテーション）を実行するためのコマンドラインインターフェースを提供する。

**業務上の目的・背景**：SQL Serverエラーログはトラブルシューティング、セキュリティ監査、コンプライアンスに不可欠な情報源である。ログイン失敗の追跡、システムイベントの監視、構成変更の確認などに活用される。本機能により、複数インスタンスのエラーログを効率的に検索・分析でき、適切なログ保持ポリシーの設定とメンテナンス自動化が可能である。

**画面へのアクセス方法**：PowerShellコンソールから `Get-DbaErrorLog`、`Get-DbaErrorLogConfig`、`Set-DbaErrorLogConfig`、または `Invoke-DbaCycleErrorLog` コマンドを実行する。

**主要な操作・処理内容**：
1. エラーログの取得（Get-DbaErrorLog）：ログ番号、ソース、テキスト、日時でフィルタリング
2. エラーログ構成の取得（Get-DbaErrorLogConfig）：保持数、サイズ上限、パスの確認
3. エラーログ構成の設定（Set-DbaErrorLogConfig）：保持数、サイズ上限の変更
4. エラーログのサイクル（Invoke-DbaCycleErrorLog）：インスタンス/エージェントログのローテーション

**画面遷移**：Get-DbaErrorLogConfigで現在設定を確認し、Set-DbaErrorLogConfigで設定変更。メンテナンス時にInvoke-DbaCycleErrorLogでログをサイクル。

**権限による表示制御**：Get-DbaErrorLogは一般的な接続権限で実行可能。Set-DbaErrorLogConfigはサーバー設定変更権限が必要。Invoke-DbaCycleErrorLogはsysadmin権限が推奨。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 119 | Get-DbaErrorLog | 主機能 | エラーログの取得 |
| 120 | Get-DbaErrorLogConfig | 補助機能 | エラーログ設定の取得 |
| 224 | Set-DbaErrorLogConfig | 補助機能 | エラーログ設定の変更 |
| 163 | Invoke-DbaCycleErrorLog | 補助機能 | エラーログのサイクル |

## 画面種別

コマンドラインインターフェース（取得・設定・実行）

## URL/ルーティング

PowerShellコマンド実行

## 入出力項目

### Get-DbaErrorLog パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| LogNumber | int[] | 任意 | ログ番号（0-99、0が最新） |
| Source | object[] | 任意 | ソースでフィルタ（Logon、Server等） |
| Text | string | 任意 | テキストパターンでフィルタ |
| After | datetime | 任意 | 指定日時以降のエントリ |
| Before | datetime | 任意 | 指定日時以前のエントリ |
| EnableException | Switch | 任意 | 例外を有効にする |

### Get-DbaErrorLogConfig パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| EnableException | Switch | 任意 | 例外を有効にする |

### Set-DbaErrorLogConfig パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| LogCount | int | 任意 | 保持するログファイル数（6-99） |
| LogSize | int | 任意 | ログファイル最大サイズ（KB、SQL 2012以上） |
| EnableException | Switch | 任意 | 例外を有効にする |

### Invoke-DbaCycleErrorLog パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| Type | string | 任意 | ログタイプ（instance、agent、両方） |
| EnableException | Switch | 任意 | 例外を有効にする |

## 表示項目

### Get-DbaErrorLog 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| LogDate | datetime | ログエントリ日時 |
| Source | string | ソース（ProcessInfo） |
| Text | string | ログメッセージテキスト |

### Get-DbaErrorLogConfig 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| LogCount | int | 保持ログファイル数 |
| LogSize | dbasize | ログファイル最大サイズ（SQL 2012以上） |
| LogPath | string | エラーログパス |

### Set-DbaErrorLogConfig 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| LogCount | int | 新しい保持ログファイル数 |
| LogSize | dbasize | 新しいログファイル最大サイズ |

### Invoke-DbaCycleErrorLog 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| LogType | string[] | サイクルされたログタイプ |
| IsSuccessful | bool | 成功フラグ |
| Notes | Exception | 失敗時の例外情報 |

## イベント仕様

### 1-Get-DbaErrorLog実行

1. Connect-DbaInstanceで接続
2. LogNumber未指定時は99..0の全ログを読み取り
3. $server.ReadErrorLog($number)でログエントリ取得
4. Source/Text/After/Beforeでフィルタリング
5. PSCustomObjectとして出力

### 2-Get-DbaErrorLogConfig実行

1. Connect-DbaInstanceで接続
2. $server.NumberOfLogFilesで保持数取得
3. $server.ErrorLogSizeKbでサイズ取得（SQL 2012以上）
4. $server.ErrorLogPathでパス取得
5. PSCustomObjectとして出力

### 3-Set-DbaErrorLogConfig実行

1. Connect-DbaInstanceで接続
2. LogSize指定時：
   - SQL 2012未満はエラー
   - $server.ErrorLogSizeKb = 値
   - $server.Alter()
3. LogCount指定時：
   - $server.NumberOfLogFiles = 値
   - $server.Alter()
4. PSCustomObjectとして出力

### 4-Invoke-DbaCycleErrorLog実行

1. Connect-DbaInstance（MinimumVersion 9）で接続
2. Typeに応じてSQL生成：
   - instance: sp_cycle_errorlog
   - agent: sp_cycle_agent_errorlog
   - 両方: 両ストアドプロシージャ
3. $server.Query($sql)で実行
4. PSCustomObjectとして出力

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaErrorLog | エラーログファイル | READ | SMO経由でログ読み取り |
| Get-DbaErrorLogConfig | - | SMO読取 | サーバー設定読み取り |
| Set-DbaErrorLogConfig | - | SMO更新 | サーバー設定更新 |
| Invoke-DbaCycleErrorLog | master/msdb | EXEC | システムストアドプロシージャ実行 |

### テーブル別更新項目詳細

#### SMO Server経由（Set-DbaErrorLogConfig）

| 操作 | 項目 | 更新値・取得条件 | 備考 |
|-----|-----|-----------------|------|
| UPDATE | NumberOfLogFiles | 6-99の整数 | ログ保持数 |
| UPDATE | ErrorLogSizeKb | 任意のKB値 | SQL 2012以上 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|--------------|----------|
| MSG001 | エラー | "Size is cannot be set on $instance. SQL Server 2008 R2 and below not supported." | SQL 2012未満でLogSize指定時 |
| MSG002 | 警告 | "The provided value for LogSize is already set to $LogSize KB on $instance" | 同じ値を設定しようとした場合 |
| MSG003 | 警告 | "The provided value for LogCount is already set to $LogCount on $instance" | 同じ値を設定しようとした場合 |
| MSG004 | エラー | "Issue cycling $logs on $server" | ログサイクル失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| SQL 2012未満でLogSize設定 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| ログサイクル失敗 | 失敗結果をIsSuccessful=falseで出力し、Continueで次のインスタンスへ |

## 備考

- エラーログ番号0は現在のアクティブログ、番号が大きいほど古いログ
- SQL Serverは既定で6つのログファイルを保持（最大99まで設定可能）
- LogSizeによる自動ローテーションはSQL Server 2012以上でのみ利用可能
- エラーログパスの変更はSet-DbaStartupParameterで行う
- Invoke-DbaCycleErrorLogはメンテナンス時に新しいログファイルを開始
- MinimumVersion 9（SQL Server 2005以上）が必要

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | LogFileEntryの拡張（行150-155）を確認 |
| 1-2 | Get-DbaErrorLogConfig.ps1 | `public/Get-DbaErrorLogConfig.ps1` | 出力オブジェクトの構造（行77-84）を確認 |

**読解のコツ**: SMO LogFileEntryにComputerName/InstanceName/SqlInstanceを追加していることを理解する

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | param()ブロック（行115-126）でパラメータ定義を確認 |
| 2-2 | Get-DbaErrorLogConfig.ps1 | `public/Get-DbaErrorLogConfig.ps1` | param()ブロック（行55-60）でパラメータ定義を確認 |
| 2-3 | Set-DbaErrorLogConfig.ps1 | `public/Set-DbaErrorLogConfig.ps1` | param()ブロック（行85-93）でパラメータ定義を確認 |
| 2-4 | Invoke-DbaCycleErrorLog.ps1 | `public/Invoke-DbaCycleErrorLog.ps1` | param()ブロック（行76-83）でパラメータ定義を確認 |

**主要処理フロー**:
1. **行140-142**: LogNumber未指定時は99..0を設定
2. **行145**: $server.ReadErrorLog($number)でログ取得
3. **行146-148**: Source/Text/After/Beforeフィルタ

#### Step 3: ログ設定取得・変更ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaErrorLogConfig.ps1 | `public/Get-DbaErrorLogConfig.ps1` | NumberOfLogFiles/ErrorLogSizeKb/ErrorLogPath取得（行69-83） |
| 3-2 | Set-DbaErrorLogConfig.ps1 | `public/Set-DbaErrorLogConfig.ps1` | LogSize/LogCount設定（行112-151） |

**主要処理フロー**:
- **行69**: $server.NumberOfLogFilesで保持数取得
- **行71-75**: ErrorLogSizeKb取得（SQL 2012以上のみ）
- **行121-122**: ErrorLogSizeKb設定とAlter()

#### Step 4: ログサイクルロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Invoke-DbaCycleErrorLog.ps1 | `public/Invoke-DbaCycleErrorLog.ps1` | Type分岐とsp_cycle_errorlog実行（行85-145） |

**主要処理フロー**:
- **行93-108**: Type分岐でSQL生成
- **行124**: $server.Query($sql)で実行
- **行125-132**: 成功時のPSCustomObject出力

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

```
Get-DbaErrorLog
    |
    +-- Connect-DbaInstance
    |
    +-- (LogNumber未指定時)
    |      +-- 99..0の範囲設定
    |
    +-- foreach ($number in $lognumber)
           |
           +-- $server.ReadErrorLog($number)
           |
           +-- フィルタリング
           |      +-- Source
           |      +-- Text (wildcard)
           |      +-- After
           |      +-- Before
           |
           +-- Add-Member (ComputerName, InstanceName, SqlInstance)
           |
           +-- Select-DefaultView

Get-DbaErrorLogConfig
    |
    +-- Connect-DbaInstance
    |
    +-- $server.NumberOfLogFiles
    |
    +-- (VersionMajor >= 11)
    |      +-- $server.ErrorLogSizeKb
    |
    +-- $server.ErrorLogPath
    |
    +-- PSCustomObject出力

Set-DbaErrorLogConfig
    |
    +-- Connect-DbaInstance
    |
    +-- (LogSize指定時)
    |      +-- バージョンチェック (VersionMajor >= 11)
    |      +-- $server.ErrorLogSizeKb = 値
    |      +-- $server.Alter()
    |
    +-- (LogCount指定時)
           +-- $server.NumberOfLogFiles = 値
           +-- $server.Alter()

Invoke-DbaCycleErrorLog
    |
    +-- Connect-DbaInstance -MinimumVersion 9
    |
    +-- Type分岐
    |      +-- 'agent': sp_cycle_agent_errorlog
    |      +-- 'instance': sp_cycle_errorlog
    |      +-- 両方: 両ストアドプロシージャ
    |
    +-- $server.Query($sql)
    |
    +-- PSCustomObject出力
```

### データフロー図

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

SqlInstance ──────▶ Connect-DbaInstance ──────▶ SMO Server Object
                           |
                           v
                    (Get-DbaErrorLog)
                    $server.ReadErrorLog()
                           |
                           v
                    フィルタリング
                           |
                           v
                    LogFileEntry + 拡張 ──────▶ エラーログエントリ

                    (Get-DbaErrorLogConfig)
                    NumberOfLogFiles
                    ErrorLogSizeKb
                    ErrorLogPath
                           |
                           v
                    PSCustomObject ──────▶ ログ構成情報

                    (Set-DbaErrorLogConfig)
                    ErrorLogSizeKb / NumberOfLogFiles
                           |
                           v
                    $server.Alter() ──────▶ 更新結果

                    (Invoke-DbaCycleErrorLog)
                    sp_cycle_errorlog / sp_cycle_agent_errorlog
                           |
                           v
                    PSCustomObject ──────▶ サイクル結果
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaErrorLog.ps1 | `public/Get-DbaErrorLog.ps1` | ソース | エラーログ取得 |
| Get-DbaErrorLogConfig.ps1 | `public/Get-DbaErrorLogConfig.ps1` | ソース | エラーログ設定取得 |
| Set-DbaErrorLogConfig.ps1 | `public/Set-DbaErrorLogConfig.ps1` | ソース | エラーログ設定変更 |
| Invoke-DbaCycleErrorLog.ps1 | `public/Invoke-DbaCycleErrorLog.ps1` | ソース | エラーログサイクル |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
