Руководство поставщика ETW на основе имени .Net 4.0

Я хочу получить руководство поставщика событий на основе имени поставщика событий (например, Sample-Test)

Образец кода

[EventSource(Name = "Sample-Test")]
public sealed class EventSourceLogger : EventSource

вот мой провайдер

internal class EventProviderVersionOne : EventProvider
{
    internal EventProviderVersionOne(Guid id)
        : base(id)
    { }

    [StructLayout(LayoutKind.Explicit, Size = 16)]
    private struct EventData
    {
        [FieldOffset(0)]
        internal UInt64 DataPointer;
        [FieldOffset(8)]
        internal uint Size;
        [FieldOffset(12)]
        internal int Reserved;
    }

}

Мой класс регистратора для регистрации событий

public class EventLogger
{
    public static EventLogger Log = new EventLogger();

    internal static EventProviderVersionOne MProvider = new EventProviderVersionOne(new Guid(ConfigurationSettings.AppSettings["EtwEventProviderGuid"]));

    ...
}

Предложите код, необходимый для получения GUID на основе EventSourceName. Я уже зарегистрирован на Eventvwr.


person KRP    schedule 27.09.2013    source источник


Ответы (4)


Я нашел свой ответ в github.

https://github.com/jonwagner/EventSourceProxy/blob/master/EventSourceProxy/EventSourceManifest.cs

Спасибо.

person KRP    schedule 27.09.2013

Я использовал PerfView для получения GUID. Начните захват, включите поставщика, которому вы хотите знать GUID, запустите ведение журнала, перейдите к записи «журнал» и здесь вы увидите GUID.

Когда вы зарегистрировали провайдера для всей системы, вы можете использовать xperf -providers для просмотра GUID.

person magicandre1981    schedule 27.09.2013

Ниже приведен алгоритм в менее запутанной форме:

    public static byte[] Concat(byte[] a, byte[] b)
    {
        byte[] retval = new byte[a.Length + b.Length];
        a.CopyTo(retval, 0);
        b.CopyTo(retval, a.Length);
        return retval;
    }

    public static byte[] Slice(byte[] a, int startIndex, int length)
    {
        byte[] retval = new byte[length];
        Array.Copy(a, startIndex, retval, 0, length);
        return retval;
    }

    private static Guid GenerateGuidFromName(string name)
    {
        byte[] namespaceGuid = Guid.Parse("b22d2c48-90c3-c847-87f8-1a15bfc130fb").ToByteArray();
        byte[] nameBytes = Encoding.BigEndianUnicode.GetBytes(name);
        byte[] sha1Hash = SHA1.Create().ComputeHash(Concat(namespaceGuid, nameBytes));
        byte[] guidBytes = Slice(sha1Hash, 0, 16);
        // Overwrite the top 4 bits of the 8th byte with 0101
        {
            guidBytes[7] &= 0x0F;
            guidBytes[7] |= 0x50;
        }
        return new Guid(guidBytes);
    }
person Doug Coburn    schedule 07.03.2014

Это мой быстрый и грязный способ сделать это. Он отлично работает для служебной программы, в которой я его использую, но я бы кэшировал сопоставления в долго работающем производственном приложении, чтобы избежать непредвиденных последствий создания источников событий.

    private static Guid GenerateGuidFromName(string name)
    {
        var eventSource = new EventSource(name);
        return eventSource.Guid;
    }
person Reed Rector    schedule 23.09.2020