Windowsパフォーマンスログの日次世代管理・解析

## 1.この記事について

最近Windows Serverのパフォーマンスログの取得について触れる機会があったので
備忘録です。

■目的
・windowsパフォーマンスログを日次で自動的に取得する
・パフォーマンスログ情報をExcelで参照できるようにする

## 2.目次
[1.この記事について](#1この記事について)
[2.目次](#2目次)
[3.使用環境](#3使用環境)
[4.データコレクトセットの作成](#4データコレクタセットの作成)
[5.データコレクトセットの自動化](#5データコレクトセットの自動化)
[6.blgファイルのExcel変換&統計処理](#6blgファイルのexcel変換統計処理)
[7.最後に](#7最後に)

## 3.使用環境
Windows 10 HOME


## 4.データコレクタセットの作成
パフォーマンスログを取得するためには"データコレクタセット"と呼ばれる
収集するデータ、スケジュールの定義を行うものを作成する必要があります。
今回はCPU使用率とメモリ空き容量を取得するデータコレクタセットを作成してみます。



4-1.パフォーマンスモニタを開き、データコレクタセット>ユーザ定義>新規作成>データコレクタセットを押下します。

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/7a557d04-70c1-d591-2813-b39dc9d8ce75.jpeg)

4-2.作成するデータコレクトセットの名前を入力し、"手動で作成する"を選択。
入力値を確認し、次を押下します。
![スクリーンショット 2024-10-26 183901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/910c5b36-d0b5-cfa8-864c-7b07faca0caa.png)

4-3.データの種類では"データログを作成する","パフォーマンスカウンター"を選択し次へを押下します。
![スクリーンショット 2024-10-28 214346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/2bea11be-9dc5-e26c-4ba1-276e58b448fb.png)

4-4.収集するデータの詳細を指定します。今回はMemory>Available Byte(空き容量)とProcessor>Processor Time(cpu使用率)を取得します。
![スクリーンショット 2024-10-28 215054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/2c82400a-0116-24df-0059-c07f82c1bb7c.png)

4-5.指定したデータの確認とデータ取得間隔を設定します。
特に要件がなければデフォルトの15秒で良いと思います。
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/8b1460c8-279a-199d-7fd1-1b8d6c0b0bfd.jpeg)

4-6.パフォーマンスログが出力されるフォルダを指定します。デフォルトでは以下の場所に出力されます。
```
C:\PerfLogs\Admin\<ログ名>
```

![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/63d5ee0e-9c25-f8a7-5bd8-11f787a29d5c.jpeg)

4-7.別のユーザーとして実行："<規定>","保存して閉じる"を選択し、完了を押下します。
![スクリーンショット 2024-10-28 220917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/e155bbf5-9798-8000-ab8c-215554e40578.png)

4-8.データコレクタセット>ユーザ定義配下に作成したデータコレクタセットが表示されます。
![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/f91763b6-310a-89df-b3b9-f9ccfc876cd5.jpeg)


これでデータコレクタセットの作成は完了です。


## 5.データコレクトセットの自動化
4章で作成したデータコレクタセットを自動起動、停止する設定を入れていきます。

### 5-1.自動起動設定
5-1-1.作成したデータコレクタセット>プロパティ>ディレクトリタブを開き、出力されるフォルダの設定を行います。
今回はファイル名に日付を入れるため、サブディレクトリは設定しません。
![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/67862749-5f99-cfe6-07e1-6cf61e946087.jpeg)

![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/2eec7f1e-1085-edba-7295-24903f9b2f05.jpeg)

5-1-3.スケジュールタブで毎日0:00でパフォーマンスカウンタが開始されるよう設定します。

![WS000020.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/9ac7e44f-b054-dba0-295d-506cc81bd119.jpeg)


5-1-4.パフォーマンスカウンタ(画面右側)>プロパティ>ファイルタブを開き、ファイル名のフォーマットを設定します。
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/27cee61c-916c-5f08-8198-d2b422adf44e.jpeg)

![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/80837021-e211-b801-bdfc-e5474119c9c5.jpeg)

これで自動起動設定は完了です。
このままだと開始するだけで停止しないので別途自動停止設定を行います。

### 5-2.自動停止設定
今回はタスクスケジューラを使用してログ収集を停止します。

5-2-1.タスクスケジューラ>タスクスケジューラライブラリ>タスクの作成を押下します。
![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/96205f06-fd14-de85-665b-917ad82a5a24.jpeg)

5-2-2.全般タブにてタスクの名前と"ユーザーがログオンしているかどうかにかかわらず実行する"を選択します。
![スクリーンショット 2024-10-29 222123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/9676bc21-563e-d0bc-f43f-5dfbe0c1a948.png)

5-2-3.トリガータブにてタスク実行時間を設定します。

![スクリーンショット 2024-10-29 223341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/1ffe798b-cc84-f3d6-dcf3-c35b895926d8.png)

5-2-4.操作タブ>新規作成で実行する操作を設定します。
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3326164/edbf311c-87d8-4e0f-2585-28b3bd390bdb.jpeg)

```プログラム/スクリプト
C:\Windows\System32\logman.exe
```
```引数の追加
stop "データコレクタセット名"
```
これで設定した時間にデータコレクタセットが停止するようになります。



## 6.blgファイルのExcel変換&統計処理
blgファイルをExcelで使用したい場合はいくつかやり方がありますが、今回はPowerShellを使用して
・blgファイル→csvファイルへの変換
・データの平均値、最大/最小値の出力
この2点を実装してみました。

以下にサンプルコードを記載します。
今回は"CPU使用率"と"空メモリ量"を取得している前提で作成しました。
出力結果は各項目の加工前データシートと加工後のサマリシートが作成されます。

[サンプルコード]
```
param (
    [Parameter(Mandatory = $true)]
    [string]$blgFilePath  # 読み込む.blgファイルのフルパス
)

# 指定された.blgファイルが存在するか確認
if (-not (Test-Path -Path $blgFilePath)) {
    Write-Output "エラー: 指定された.blgファイルが見つかりません: $blgFilePath"
    exit
}

Write-Output "解析対象ファイル: $blgFilePath"

# 出力するExcelファイル名を現在の日付で指定
$outputExcelPath = "$(Get-Date -Format 'yyyyMMdd').xlsx"

# 必要なモジュールのインポート
if (-not (Get-Module -ListAvailable -Name ImportExcel)) {
    Install-Module -Name ImportExcel -Scope CurrentUser -Force
}
Import-Module -Name ImportExcel

# .blgファイルのカウンターデータを読み込む
try {
    $counters = Import-Counter -Path $blgFilePath
} catch {
    Write-Output "エラー: .blgファイルの読み込み中にエラーが発生しました: $($_.Exception.Message)"
    exit
}

# 統計情報をまとめるためのリスト
$mainSheetData = @()

# 各カウンターのデータを処理
$counters.CounterSamples |
    Group-Object -Property Path | ForEach-Object {
        $counterGroup = $_.Group
        $path = $_.Name

        # 必要な統計値を算出（最大値、最小値、平均値）
        $max = ($counterGroup | Measure-Object -Property CookedValue -Maximum).Maximum
        $min = ($counterGroup | Measure-Object -Property CookedValue -Minimum).Minimum
        $average = ($counterGroup | Measure-Object -Property CookedValue -Average).Average

        # 統計情報をメインシート用に収集
        $mainSheetData += [PSCustomObject]@{
            "CounterPath" = $path
            "MaxValue"    = [math]::Round($max, 2)     # 最大値
            "MinValue"    = [math]::Round($min, 2)     # 最小値
            "AvgValue"    = [math]::Round($average, 2) # 平均値
        }

        # 元データを別シートに出力
        $rawDataSheetName = ($path -replace '[\\/:*?"<>|]', '_') # シート名に使用できない文字を置換
        $counterGroup | Select-Object Timestamp, CookedValue |
            Export-Excel -Path $outputExcelPath -WorksheetName $rawDataSheetName -Append
    }

# メインシートに統計情報を出力
$mainSheetName = "Summary"
$mainSheetData | Export-Excel -Path $outputExcelPath -WorksheetName $mainSheetName -Append

Write-Output "Excelファイルに出力が完了しました: $outputExcelPath"
```


## 7.最後に
一通り自分でやって感じたこととしては、クラウドならこんな面倒くさいことしなくていいのに...でした。(その分お金はかかりますが)
クラウド技術を使っているときに、実際にどんなことが物理で発生しているのか思いを馳せられるエンジニアになりたいと思います。