0

システムで使用可能なすべてのイベント ソースをリッスンする ETW リスナーを開発しています。

Q1: 以下のサンプル コードを見つけてください。

providerName = "ETW-TEST-APPLICATION";
sessionName = "ETW-TEST-APPLICATION";

using (var session = new TraceEventSession(sessionName, null))
{
    try
    {
        session.StopOnDispose = true;
        session.BufferSizeMB = 100;
        Console.CancelKeyPress +=
            delegate(object sender, ConsoleCancelEventArgs e) { session.Dispose(); };

        using (source = new ETWTraceEventSource(sessionName, TraceEventSourceType.Session))
        {

            var parser = new DynamicTraceEventParser(source);
            parser.AddDynamicProvider(new ProviderManifest(Environment.CurrentDirectory +
                                                           "\\ETWApplicationRegister." +
                                                           providerName +
                                                           ".etwManifest.man"));

            parser.All += delegate(TraceEvent data)
            {
                Console.WriteLine("--------------------------------------------------------------");
                Console.WriteLine("ProviderName : " + data.ProviderName);
                Console.WriteLine("ProviderGuid : " + data.ProviderGuid);
                Console.WriteLine("EventID : " + data.ID);
                Console.WriteLine("Level : " + data.Level);
                Console.WriteLine("Channel : " + data.Channel);
                Console.WriteLine("Task : " + data.Task);
                Console.WriteLine("TaskName : " + data.TaskName);
                Console.WriteLine("TimeStamp : " + data.TimeStamp);
                Console.WriteLine("FormattedMessage : " + data.FormattedMessage);
                Console.WriteLine("PayLoad : " + data.PayloadByName("jsonArgs"));
                Console.WriteLine("--------------------------------------------------------------");
            };

            session.EnableProvider(providerGuid);

            source.Process(); //On execution of this statement system listens to the events
        }
    }
}

このコードは、「ETW-TEST-APPLICATION」という 1 つのイベント ソースに適しています。このリスナーを複数のイベント ソース「ETW-TEST-APPLICATION2」、「ETW-TEST-APPLICATION3」などで使用したいと考えています。

これを実現するために利用できるオプションについて教えてください。スレッドで試しましたが、うまくいきませんでした。

Q2: 複数の session.EnableProvider を使用できるかどうかも教えてください。情報メッセージとエラー メッセージのみを有効にして、警告メッセージを無視したいです。 session.EnableProvider(providerGuid,TraceEventLevel.Informational); session.EnableProvider(providerGuid,TraceEventLevel.Error);

4

1 に答える 1

2

Q1: 複数のプロバイダーが 1 つのセッションにある場合、複数のプロバイダーを有効にするために複数の ETWTraceEventSource は必要ありません。つまり、ソースごとに新しい DynamicTraceEventParser を作成する必要がある場合は、イベント ハンドラーを各パーサーにフックします。

Q2: アセンブリを検索して複数のプロバイダーを有効にする方法の簡単な例を次に示します。

    void EnableAllEventSources()
    {
        foreach (var es in GetEventSourceNamesFromAssembly(GetType().Assembly);)
            _session.EnableProvider(es);
    }

    IEnumerable<string> GetEventSourceNamesFromAssembly(Assembly assembly)
    {
        return assembly.GetTypes()
            .Where(t => t.BaseType == (typeof(EventSource)))
            .Select(t => {
                var attribute = Attribute.GetCustomAttribute(t, typeof(EventSourceAttribute));
                return ((EventSourceAttribute)attribute).Name;
            });
    }
于 2015-02-19T18:34:13.477 に答える