急にEventSourceクラスを使ってEvent Tracing for Windows経由でイベントログにログを書くことになった人向けのチュートリアル

# はじめに
C#でサービスを書いていて、サービスのログをイベントログに書き出したい！と思った方向けのチュートリアルです。
以下のような読者を想定しています：

- Log4NetやNLogについて調べていたら「これからはETW（Event Tracing for Windows）！」と言われ「あわわ…」となった。
- ETWについて調べていたらSemantic Logging Application Block（SLAB）に話が飛んでわけがわからなくなった。
- ETWの解説記事を素直に読んでいたらPerfViewをインストールさせられて我慢の限界に達した。

この記事の内容は以下の環境でテストしました。

- Windows 7 Professional
- Visual Studio 2015 Professional
- .Net Framework 4.6

# サンプルコード

ETW経由でイベントログへの書き込みを行うコードは次の通りです。

```C#:サンプルコード
using System;
using System.Diagnostics.Tracing; // EventSource

namespace SampleETW
{
    class Program
    {
        static void Main(string[] args)
        {
            MyEventSource.Log.Critical("大変なことになりました。");
            Console.WriteLine("イベントログを確認して下さい(Enterキーで終了)");
            Console.ReadLine();
        }
    }

    [EventSource(Name = "AwesomeService")]
    sealed class MyEventSource : EventSource
    {
        public static readonly MyEventSource Log = new MyEventSource();

        [Event(1, Level = EventLevel.Critical, Message = "{0}", Channel = EventChannel.Admin)]
        public void Critical(string message)
        {
            WriteEvent(1, message ?? "");
        }
    }
}
```

# 必要なパッケージ

イベントログに対して「このイベントソースを拾ってね」という指定を後ほど行いますが、その際に必要となる”EventSourceクラスを継承したクラスの詳細情報が書かれたファイル”を生成しなくてはなりません。
ファイルの生成は**eventRegister.exe**コマンドで行うことができます。NuGetパッケージの**Microsoft.Diagnostics.Tracing.EventRegister**をプロジェクトに追加することで、このコマンドのインストールとプロジェクトのビルド時に生成の自動実行を行うことができます。

```
Install-Package Microsoft.Diagnostics.Tracing.EventRegister
```

プロジェクトをビルドすると、__*.etwManifest.dll__ と__*.etwManifest.man__の2つのファイルが生成されていることが確認できます。

```
2015/11/10  14:12    <DIR>          .
2015/11/10  14:12    <DIR>          ..
2015/11/10  14:12             4,096 SampleETW.AwesomeService.etwManifest.dll
2015/11/10  14:11             2,518 SampleETW.AwesomeService.etwManifest.man
2015/11/10  14:12               370 SampleETW.etwManifests.lst
2015/11/10  14:11             5,120 SampleETW.exe
2015/11/10  14:02               187 SampleETW.exe.config
2015/11/10  14:11            11,776 SampleETW.pdb
2015/11/10  14:08            22,696 SampleETW.vshost.exe
2015/11/10  14:02               187 SampleETW.vshost.exe.config
2013/03/18  17:00               490 SampleETW.vshost.exe.manifest
```

# イベントログへの登録

イベントログをコントロールするコマンド**wevtutil.exe**を使用してこのイベントソースを登録します。

```bat:イベントログへの登録
wevtutil.exe im SampleETW.AwesomeService.etwManifest.man 
	/rf:"C:\src\SampleETW\SampleETW\bin\Debug\SampleETW.AwesomeService.etwManifest.dll" 
	/mf:"C:\src\SampleETW\SampleETW\bin\Debug\SampleETW.AwesomeService.etwManifest.dll"
```

/rfオプションおよび/mfオプションではファイルのフルパスを指定する必要があることに注意してください。

登録を解除する場合はこちら。

```bat:イベントログから登録を解除
wevtutil.exe um SampleETW.AwesomeService.etwManifest.man
```

# サンプルコードの実行

サンプルコードを実行すると、「イベントビューアー」→「アプリケーションとサービスログ」以下に「AwesomeService」というエントリが追加され、ログが記録されているのが確認できます。

# 参考

- [EventRegister User’s Guide](https://github.com/Microsoft/dotnetsamples/blob/master/Microsoft.Diagnostics.Tracing/EventSource/docs/EventRegister.md)
- [6 – Logging What You Mean: Using the Semantic Logging Application Block](https://msdn.microsoft.com/ja-jp/library/dn440729%28v=pandp.60%29.aspx)
- [EtwStream - ETW/EventSourceのRx化 + ビューアーとしてのLINQPad統合](http://neue.cc/2015/11/03_520.html)