はじめに
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経由でイベントログへの書き込みを行うコードは次の通りです。
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を使用してこのイベントソースを登録します。
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オプションではファイルのフルパスを指定する必要があることに注意してください。
登録を解除する場合はこちら。
wevtutil.exe um SampleETW.AwesomeService.etwManifest.man
サンプルコードの実行
サンプルコードを実行すると、「イベントビューアー」→「アプリケーションとサービスログ」以下に「AwesomeService」というエントリが追加され、ログが記録されているのが確認できます。