Ведение семантического журнала с использованием ETW с не регистрируемыми пользовательскими ключевыми словами

Я пытаюсь использовать .Net 4.5, семантическое ведение журнала (SLAB) EventSource, для создания событий с пользовательскими ключевыми словами. Я хотел бы использовать Out-of-Process и использовать ключевые слова для управления событиями в файлах журналов или SQL. Я использовал EventSourceAnalyzer против этого класса в отдельном тесте, и никаких исключений.

Я могу «направлять» события в разные приемники, используя разные «EventLevel», но я бы предпочел направлять их с помощью настраиваемых ключевых слов.

Вот класс --

 public class XYZWebLog : EventSource
{
    public class Keywords
    {
        public const EventKeywords Login = (EventKeywords)2;
        public const EventKeywords Billing = (EventKeywords)4;
    }

    [Event(1, Level = EventLevel.Informational, Keywords = Keywords.Login)]
    public void SuccessfulLogin(string loginId) { WriteEvent(1, loginId); }
    [Event(2, Level = EventLevel.Informational, Keywords = Keywords.Login)]
    public void UnSuccessfulLogin(string loginId){ WriteEvent(2, loginId); }

    [Event(3, Level = EventLevel.Informational, Keywords = Keywords.Login)]
    public void Logout(string loginId) { WriteEvent(3, loginId); }

    [Event(4, Level = EventLevel.Informational, Keywords = Keywords.Billing)]
    public void BillAudit(string UserId, string Action, string VisitId, string BillingID, string Details) { WriteEvent(4, UserId, Action, VisitId, BillingID, Details); }

    private static XYZWebLog _log = new XYZWebLog();
    private XYZWebLog() {}
    public static XYZWebLog Log { get { return _log; } }
}

А вот и конфиг для SemanticLogging-svc.exe:

 <!-- Sinks reference definitons used by this host to listen ETW events -->

<flatFileSink name="svcRuntime" fileName="Billing.log" >
  <sources>


    <eventSource name="XYZWebLog" level="Informational" matchAnyKeyword="4" />
  </sources>

  <eventTextFormatter header="----------"/>
</flatFileSink>

<flatFileSink name="loginLogs" fileName="Login-Logout.log" >
  <sources>
    <eventSource name="XYZWebLog" level="Informational" matchAnyKeyword="2" />
  </sources>
  <eventTextFormatter header="++++++++++"/>
</flatFileSink>

Если я удалю «matchAnyKeyword» и правильно настрою уровни, я смогу сделать так, чтобы события попадали в разные файлы — я пробовал «2» и «0x002» и другие вещи, связанные с определением пользовательского события, о котором я могу думать. . Я искал в Интернете и изучал, какую документацию я мог найти.


person BillH    schedule 05.05.2015    source источник


Ответы (1)


Я мало что знаю о SLAB. Но я смог использовать ваш образец и сгенерировать события ETW на основе ключевых слов.

Вот код.

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                XYZWebLog.Log.SuccessfulLogin("naveen");
                XYZWebLog.Log.BillAudit("naveen", "bought", "123", "123", "details");

            }
        }
    }

    public class XYZWebLog : EventSource
    {
        public class Keywords
        {
            public const EventKeywords Login = (EventKeywords)2;
            public const EventKeywords Billing = (EventKeywords)4;
        }

        [Event(1, Level = EventLevel.Informational, Keywords = Keywords.Login)]
        public void SuccessfulLogin(string loginId) { WriteEvent(1, loginId); }
        [Event(2, Level = EventLevel.Informational, Keywords = Keywords.Login)]
        public void UnSuccessfulLogin(string loginId) { WriteEvent(2, loginId); }

        [Event(3, Level = EventLevel.Informational, Keywords = Keywords.Login)]
        public void Logout(string loginId) { WriteEvent(3, loginId); }
![enter image description here][1]
        [Event(4, Level = EventLevel.Informational, Keywords = Keywords.Billing)]
        public void BillAudit(string UserId, string Action, string VisitId, string BillingID, string Details)
        {
            WriteEvent(4, UserId, Action, VisitId, BillingID, Details);
        }
        private static XYZWebLog _log = new XYZWebLog();
        private XYZWebLog() { }
        public static XYZWebLog Log { get { return _log; } }
    }
}

Мой любимый инструмент для просмотра и управления событиями ETW — Perfview.

Я смог генерировать события на основе ключевого слова с помощью PerfView. Ключевые слова для провайдеров

Если вы заметили, что в поле Additional Providers я использовал ключевое слово *XYZWebLog:4, это означает, что я хочу отфильтровать только Billing событий.

И на основе этой настройки генерируются только эти события.

События аудита

И я изменил настройку на *XYZWebLog:2, и вот мой вывод

События входа

person Naveen    schedule 05.05.2015
comment
Спасибо, Навин, за столько подробностей!! -- Я использую Perfview для тестирования, но моя цель состоит в том, чтобы получать разные события для разных приемников с помощью SemanticLogging-svc.exe -- Ваша работа, кажется, подтверждает, что класс ETW в порядке -- что мне странно, так это что я не вижу события, как вы, на моем Perfview. - person BillH; 05.05.2015
comment
Если я поставлю if (IsEnabled(EventLevel.Informational, Keywords.Login)) вокруг одного из методов события для методов входа в систему, часть IsEnabled у меня не сработает. - person BillH; 05.05.2015
comment
В каком окне perfview вы ищете свои события? Вы проверяли окно событий? Вы искали какие-то исключения? - person Naveen; 05.05.2015
comment
Глядя в окно событий. Я вижу манифест, но нет событий. Я не видел никаких исключений. - person BillH; 05.05.2015
comment
Каков результат без ключевых слов? Это произвело что-то еще? Что вы ввели в текстовое поле дополнительных поставщиков? ИМО, вы должны предоставить подробную информацию и то, что вы пробовали, вместо того, чтобы я задавал каждый вопрос. Это поможет ответить на вопросы. - person Naveen; 05.05.2015
comment
Если вы читали исходное описание, я довольно четко сказал, что получаю события без ключевых слов. Было бы полезно, если бы вы прочитали исходную задачу полностью. - person BillH; 05.05.2015