У меня есть мультипроектное решение 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>
Вопросы:
- Каков рекомендуемый способ интеграции etw с nlog? Это все еще nlog etw на github?
- Каковы подробные шаги по настройке интеграции ETW с nlog?
- Как я могу отладить, почему моя интеграция может не работать?
Спасибо!
=== ОБНОВЛЕНИЕ 5-31-2018 ===
Предложение Рольфа Кристенсена использовать внутреннюю регистрацию nlog для получения дополнительной информации об отладке было полезным. Теперь я знаю, что providerId
, который я добавил, не поддерживается, но без чего-либо подобного мне неясно, как я собираю эти события nlog ETW. Обычно создается файл WPRP для сбора событий ETW, а обычно предоставляется руководство провайдера для указания, какие события собирать. Итак, если я не должен указывать идентификатор провайдера, какой идентификатор провайдера (или провайдерский провайдер) использовать при создании файла WPRP?
Еще раз спасибо.