расширение nlog.etw не испускает ETW - PullRequest
0 голосов
/ 14 мая 2018

У меня есть мультипроектное решение VS, которое интегрировано с nlog. Я хотел бы отправлять события ETW, используя мои существующие журналы. Поиск в Интернете указал мне на https://github.com/NLog/NLog.Etw.

Насколько я мог понять README и код репозитория, я пытался интегрировать свое решение, но оно не сработало, и я не видел ничего, что я мог бы использовать для отладки, почему.

  • Система: Windows Server 2012 R2
  • .NET версия: 4.71
  • NLog Версия: 4.0.1
  • NLog Etw версия: 4.1.0

Вот мой nlog.config (я тоже пробовал <targets async="true">):

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <extensions>
    <add assembly="MyCustomLoggingAssembly"/>
    
    <!-- extensions is not needed in NLog 4+ -->
    <add assembly="NLog.Etw" />
  </extensions>

  <targets>
      <target name="kinesis" xsi:type="Kinesis" stream="<stream_name>" environment="dev" system="batch" index="<index_name>" region="<region>" maxQueueSize="10000"/>
      <target name="console" xsi:type="ColoredConsole" layout="${date:format=MM/dd HH\:mm\:ss} ${logger}|${message}"/>
      <target name="filelog" xsi:type="File" fileName="Worker.log" layout="${longdate}|TID-${threadid}|${level:uppercase=true}|${logger}|${message}|${exception:format=ToString,StackTrace}${newline}"/>
      <target xsi:type="ExtendedEventTracing"
              name="nlogetw"
              providerId="ca2d86bc-1b67-419d-9048-962fa24d2cd2"
              layout="${longdate}|${uppercase:${level}}|${message}${onexception:|Exception occurred\:${exception:format=tostring}}"/>

    </targets>
    <rules>
      <logger name="Class*" minlevel="Debug" writeTo="nlogetw"/>
      <logger name="Class*" minlevel="Trace" writeTo="console"/>
      <logger name="Class*" minlevel="Info" writeTo="filelog" />
      <logger name="Class*" minlevel="Trace" writeTo="kinesis" />
      <logger name="*" minlevel="Trace" writeTo="filelog" />
    </rules>
  </nlog>

nlogetw <target>, <add assembly="NLog.Etw"/> и writeTo="nlogetw" - это биты, которые я получил прямо от https://github.com/NLog/NLog.Etw/blob/master/README.md.

Я предполагал, что мне нужно добавить атрибут providerId для цели, хотя я не видел документации для нее.

Чтобы проверить это, я создал файл wprp для сбора подробных событий для сгенерированной мной инструкции провайдера событий "ca2d ..." и использовал wprui для сбора событий. Вот файл wprp:

<?xml version="1.0" encoding="utf-8"?>
<!-- TODO: 
1. Find and replace "NlogTraceLoggingProvider" with the name of your provider.
2. See TODO below to update GUID for your event provider
-->
<WindowsPerformanceRecorder Version="1.0" Author="Microsoft Corporation" Copyright="Microsoft Corporation" Company="Microsoft Corporation">
  <Profiles>
    <EventCollector Id="EventCollector_NlogTraceLoggingProvider" Name="NlogTraceLoggingProvider">
      <BufferSize Value="64" />
      <Buffers Value="4" />
    </EventCollector>

    <!-- TODO: 
 1. Update Name attribute in EventProvider xml element with your provider GUID, eg: Name="3970F9cf-2c0c-4f11-b1cc-e3a1e9958833". Or
    if you specify an EventSource C# provider or call TraceLoggingRegister(...) without a GUID, use star (*) before your provider
    name, eg: Name="*MyEventSourceProvider" which will enable your provider appropriately.  
 2. This sample lists one EventProvider xml element and references it in a Profile with EventProviderId xml element. 
    For your component wprp, enable the required number of providers and fix the Profile xml element appropriately
-->
    <EventProvider Id="EventProvider_NlogTraceLoggingProvider" Name="ca2d86bc-1b67-419d-9048-962fa24d2cd2" />
    
    <Profile Id="NlogTraceLoggingProvider.Verbose.File" Name="NlogTraceLoggingProvider" Description="NlogTraceLoggingProvider" LoggingMode="File" DetailLevel="Verbose">
      <Collectors>
        <EventCollectorId Value="EventCollector_NlogTraceLoggingProvider">
          <EventProviders>
            <!-- TODO:
 1. Fix your EventProviderId with Value same as the Id attribute on EventProvider xml element above
-->
            <EventProviderId Value="EventProvider_NlogTraceLoggingProvider" />
          </EventProviders>
        </EventCollectorId>
      </Collectors>
    </Profile>

    <Profile Id="NlogTraceLoggingProvider.Light.File" Name="NlogTraceLoggingProvider" Description="NlogTraceLoggingProvider" Base="NlogTraceLoggingProvider.Verbose.File" LoggingMode="File" DetailLevel="Light" />
    <Profile Id="NlogTraceLoggingProvider.Verbose.Memory" Name="NlogTraceLoggingProvider" Description="NlogTraceLoggingProvider" Base="NlogTraceLoggingProvider.Verbose.File" LoggingMode="Memory" DetailLevel="Verbose" />
    <Profile Id="NlogTraceLoggingProvider.Light.Memory" Name="NlogTraceLoggingProvider" Description="NlogTraceLoggingProvider" Base="NlogTraceLoggingProvider.Verbose.File" LoggingMode="Memory" DetailLevel="Light" />

  </Profiles>
</WindowsPerformanceRecorder>

Вопросы:

  1. Каков рекомендуемый способ интеграции etw с nlog? Это все еще nlog etw на github?
  2. Каковы подробные шаги по настройке интеграции ETW с nlog?
  3. Как я могу отладить, почему моя интеграция может не работать?

Спасибо!

=== ОБНОВЛЕНИЕ 5-31-2018 === Предложение Рольфа Кристенсена использовать внутреннюю регистрацию nlog для получения дополнительной информации об отладке было полезным. Теперь я знаю, что providerId, который я добавил, не поддерживается, но без чего-либо подобного мне неясно, как я собираю эти события nlog ETW. Обычно создается файл WPRP для сбора событий ETW, а обычно предоставляется руководство провайдера для указания, какие события собирать. Итак, если я не должен указывать идентификатор провайдера, какой идентификатор провайдера (или провайдерский провайдер) использовать при создании файла WPRP?

Еще раз спасибо.

1 Ответ

0 голосов
/ 30 января 2019

NLog.ETW v4.2.0 выпущен.Он позволяет вам настраивать ETW-провайдеров с настраиваемыми именами провайдеров (используйте несколько целей, если требуется несколько имен):

<targets async="true">
    <target xsi:type="EtwEventSource"
            name="eetw"
            providerName="MyEventSourceName"
            taskName="${level}"
            layout="${message}"
          />
</targets>

См. Также: https://github.com/NLog/NLog.Etw

...