私は、非常に多くのプロジェクトにまたがる C# ソリューションを持っています。Systme.Diagnostics.Tracing.EventSource から継承する MyCustomEventSource というトレース クラスを作成しました。これは、トレース イベントのほとんどを処理します。特定のプロジェクトに関連するイベントを実装できるように、プロジェクトごとにこのクラスのサブクラスを作成したいと考えています。
また、システムのさまざまなコンポーネントからのイベントを簡単にリッスンできる ETW コンシューマーも作成しています。
しかし、私のコンシューマーはイベントを正しく認識しません。MyCustomEventSource をリッスンすると、各イベントの EventName フィールドがメソッドの名前に設定され、FormattedMessage が Message 属性に設定されます。例:
[Event(1,
Message = "The configuration parameter \"{0}\" was loaded with a value of {1}.",
Level = EventLevel.Informational,
Task = Tasks.Configuration,
Keywords = Keywords.Diagnostics)]
public void ConfigParameterLoaded(string name, string value)
{
WriteEvent(1, name, value);
}
MyCustomEventSource をリッスンし、アプリが ConfigParameterLoaded を呼び出すと、名前が ConfigParameterLoaded で、その FormattedMessage が「構成パラメーター "x" が y の値で読み込まれました」というイベントを取得します。
これで問題ありません。
ただし、MyCustomEventSource のサブクラスで同様のメソッドを作成し、このサブクラスからイベントをトリガーすると、EventName は常に「EventSourceMessage」になり、FormattedMessage は常に null になります。
これはおそらく System.Diagnostics.Tracing.EventAttribute に AttributeUsage(Inherited=true) がないためだと思います。
私の質問は次のとおりです。これを回避し、サブクラスからイベントをトリガーするときに正しい情報を取得する方法はありますか?