イベントログに特定のエラーが吐かれたらレベルアップする

[ブログからの転載](http://1bed.allright.life/?p=2261)

先輩が、アプリケーションでエラーが発生したら、Windows のイベントログにエラーを吐く仕組みをサーバーに仕込んでいたので、随時イベントログを見なくても気づけるように音を鳴らそうとお酒を飲みながら思い立った。

# Beep 音でレベルアップを知らせる

憂鬱な音だと嬉しくないので、レベルアップする事にした。

```ps1:levelup.ps1
$fa = 698
$mif = 679
$so = 784
$t = 100

[Console]::Beep($fa, $t)
[Console]::Beep($fa, $t)
[Console]::Beep($fa, $t)
[Console]::Beep($fa, $t)
Start-Sleep -Milliseconds 350
[Console]::Beep($mif, $t)
Start-Sleep -Milliseconds $t
[Console]::Beep($so, $t)
Start-Sleep -Milliseconds $t
[Console]::Beep($fa, 800)
```

これを C:\levelup\levelup.ps1 として保存した。

雑だけど気にしないで次に行く。

# 特定のログが吐かれたらレベルアップする設定

イベントを察知するとレベルが上がるタスクを作成する。

当初は、タスクスケジューラーにイベントを登録してフィルターで実装しようと思ったのだが、Windows の XPath 1.0 の実装が微妙すぎてできなかった。何故 contains を省いたのか理解に苦しむところ。

* [MSDN: Consuming Events](https://msdn.microsoft.com/en-us/library/windows/desktop/dd996910(v=vs.85).aspx)
* [Developer Network: Filter XPath 1.0 Subset](https://msdn.microsoft.com/en-us/library/cc231312.aspx)
* [Developer Network: Filter XPath 1.0 Extensions](https://msdn.microsoft.com/en-us/library/cc231313.aspx?f=255&MSPPError=-2147217396)


そこで、タスクスケジューラーはエラーイベントを感知したら levelup.ps1 をキックさせるだけにして、PowerShell で最新のエラーメッセージに misono が居ることを検知したらレベルアップすることにする。

-----

1. 「ファイル名を指定して実行」に `taskschd.msc` と入力して OK ボタンを押し、タスクスケジューラーを起動する。
2. タスクの作成をクリック  
  ![2.png](https://qiita-image-store.s3.amazonaws.com/0/118961/1854ad21-60d2-d36d-1705-910aed8b692e.png)
3. 「全般」タブを設定  
  ![3.png](https://qiita-image-store.s3.amazonaws.com/0/118961/7d439117-38c7-b457-de71-155535d7acba.png)
4. 「トリガー」タブの新規ボタンをクリック  
5. タスクの開始を「イベント時」に選択、フィルターの種類を「カスタム」に選択し、 新しいイベント フィルターボタンをクリックする  
  ![5.png](https://qiita-image-store.s3.amazonaws.com/0/118961/262dcd6b-243c-a32c-611c-b11f4ef7d9e9.png)
6. イベントレベルを「エラー」にチェックをいれ、イベントログを「アプリケーション」に設定、イベントソースを「hoge」に設定  
  ![6.png](https://qiita-image-store.s3.amazonaws.com/0/118961/da72b4a2-cacc-ddac-6a93-99ff214a9102.png)
7. 編集が終わったら OK ボタンをして、タスクの作成ウィンドウまで戻る  
  ![8.png](https://qiita-image-store.s3.amazonaws.com/0/118961/61e615f9-7678-9295-b5f4-d692cef4ef33.png)
8. 「操作」タブに移り、新規ボタンをクリック
9. 「プログラム/スクリプト」に PowerShell を、「引数の追加」に先ほど作った levelup.ps1 を指定する  
  ![9.png](https://qiita-image-store.s3.amazonaws.com/0/118961/75b24696-e1a9-9b36-8c8f-3eecfef29744.png)

  * プログラム/スクリプト  
    %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

  * 引数の追加  
    -WindowStyle Hidden -command "C:\levelup\levelup.ps1"
10. OK ボタン押していきウィンドウを閉じる


# Beep 音でレベルアップを知らせる

C:\levelup\levelup.ps1 を編集します。

```ps1
if ((Get-EventLog -LogName Application -EntryType Error -Source hoge -Newest 1).Message -match "^.*misono.*$") {
    $fa = 698
    $mif = 679
    $so = 784
    $t = 100

    [Console]::Beep($fa, $t)
    [Console]::Beep($fa, $t)
    [Console]::Beep($fa, $t)
    [Console]::Beep($fa, $t)
    Start-Sleep -Milliseconds 350
    [Console]::Beep($mif, $t)
    Start-Sleep -Milliseconds $t
    [Console]::Beep($so, $t)
    Start-Sleep -Milliseconds $t
    [Console]::Beep($fa, 800)
}
```

# 検証

テストでイベントログにエラーログを出力します。

```ps1
PS> Write-EventLog -LogName Application -EntryType Error -Source hoge -EventId 1 -Message "イベントログテスト: misono "
PS> Write-EventLog -LogName Application -EntryType Error -Source hoge -EventId 1 -Message "misono"
```

レベルアップができれば成功です。


# 考察

XPath が私の知っている XPath ではなかったのでドハマリしてしまいましたが、結論から言うとシンプルに書けた気がします。

どこにあるか判らないサーバー室ですが、突如鳴り響くレベルアップ音とか楽しみです。