2

ASP.NET WebApi アプリケーションで EventSource (WebApiEventSource) を作成しました (ITraceWriter 実装として):

[EventSource(Name = "WebApi")]
public class WebApiEventSource : EventSource
{
    public static readonly WebApiEventSource Log = new WebApiEventSource();

    [Event(1)]
    public void Event(string url, string message)
    {
        WriteEvent(1, url, message);
    }
}

EventSource のメソッドが実行時にエラーなしで呼び出されることを確認しました。

次に、PerfView を実行し、そのログで、プロバイダー (EventSource) を確認できることを確認しました。

解析仕様 *WebApi 有効化プロバイダー:*WebApi レベル:クリティカル キーワード:0x0 オプション:なし 値: Guid:fc7bbb67-1b01-557b-5e0e-c1c4e40b6a24

次に、フィルター「*WebApi」を使用して「collect」を実行し、アプリで何らかのアクションを実行して停止します。

しかし、etl ファイルには私のプロバイダーからのイベントはありません! セクション「イベント」には、プロバイダーの名前すら含まれていません。

私は何を取りこぼしたか?

更新: 理由が見つかりました。以下の回答を参照してください。

4

1 に答える 1

3

イベントが欠落している理由は非常に微妙であることがわかりました。簡単にするために、すべてのコードは提供しませんでした。重要だと思った部分、つまり呼び出しているメソッドだけを提供しEventSource.WriteEventました。

EventSource実装クラスにEventSource.WriteEvent、同じ ID で呼び出される他のメソッドが含まれている場合、このEventSourceからのイベントは表示されないことは興味深いことです。信じられないことですが、そうです。

したがって、私のクラスには、使用しなかった WriteEvent 呼び出しを伴うメソッドがもう 1 つありました。

[EventSource(Name = "WebApi")]
public class WebApiEventSource : EventSource
{
    public static readonly WebApiEventSource Log = new WebApiEventSource();

    public void Event(string url, string message)
    {
        WriteEvent(1, url, message);
    }

    public void Event2(string url, string message)
    {
        WriteEvent(1, url, message);
    }
}

その後、追加のメソッド (Event2) を削除しました。PerfView ログにイベントが表示されました。

注: EventAttribute の適用は完全にオプションです。

私が見つけた別の理由は、呼び出すメソッドがWriteEvent文字列ではない引数を持つべきではないということです。

于 2013-10-31T10:53:47.473 に答える