SemanticLogging выдает исключение при обработке команд для EventSource

На некоторых машинах (вероятно, только в Windows 7 и 2008 R2, но не в Windows 10) у меня возникают проблемы с использованием SemanticLogging. Когда я запускаю его, я получаю следующий вывод:

Event Trace Session prefix: Microsoft-SemanticLogging-Etw

Sink name: ConsoleEventSink
Event sources:
Name: 8943bf09-be18-551a-efe5-612ee62ded5e
Performance, Level: LogAlways, MatchAnyKeyword: None

Sink name: PerformaceSINK
Event sources:
Name: 8943bf09-be18-551a-efe5-612ee62ded5e
Performance, Level: LogAlways, MatchAnyKeyword: None

Service started.

Press enter to end ...
ERROR: Exception in Command Processing for EventSource Performance: Object
reference not set to an instance of an object.;

Все, что происходит в определенных сценариях:

  1. Я запускаю процесс, который пишет Events
  2. затем я запускаю SemanticLogging-svc.exe -c
  3. через несколько секунд возникает ошибка

Но когда меняю порядок и сначала запускаю SemanticLogging-svc.exe, а потом запускаю "event writer", все идет как надо.

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

Используя PerfView, я проверил исходный код Microsoft-SemanticLogging-Etw, но там ничего нет.

SemanticLogging-svc.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns="http://schemas.microsoft.com/practices/2013/entlib/semanticlogging/etw"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://schemas.microsoft.com/practices/2013/entlib/semanticlogging/etw SemanticLogging-svc.xsd">
  <traceEventService />
  <sinks>
    <consoleSink name="ConsoleEventSink">
      <sources>
        <eventSource name="PerformanceEventSource" level="LogAlways" />
      </sources>
      <customEventTextFormatter type="ServiceTelemetry.EventFormatter.CsvEventFormatter, ServiceTelemetry"/>
    </consoleSink>
    <rollingFlatFileSink
      name="PerformanceEventSourceSINK"
      fileName=".\logs\%ComputerName%_Performance.log"
      rollFileExistsBehavior="Increment"
      rollInterval="Midnight"
      timeStampPattern="yyyyMMdd">
      <sources>
        <eventSource name="PerformanceEventSource" level="LogAlways" />
      </sources>
      <customEventTextFormatter type="ServiceTelemetry.EventFormatter.CsvEventFormatter, ServiceTelemetry"/>
    </rollingFlatFileSink>
   </sinks>
</configuration>

EventFormatter:

namespace ServiceTelemetry.EventFormatter
{
    public class CsvEventFormatter : IEventTextFormatter
    {
        public void WriteEvent(EventEntry eventEntry, TextWriter writer)
        {
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < eventEntry.Payload.Count; i++)
            {
                sb.AppendFormat("{0};", eventEntry.Payload[i]);
            }
            writer.WriteLine(sb.ToString());
        }

    }
}

Источник событий:

namespace ServiceTelemetry.EventSources
{
    [EventSource(Name = "Performance")]
    public sealed class PerformanceEventSource : EventSource
    {
        [Event(1, Level = EventLevel.LogAlways, Task = TaskCodes.GetResource, Opcode = OperationCodes.Compleated)]
        public void GetResourceSuccess(string Session, string ResourceName, long ElapsedMilliseconds)
        {
            if (IsEnabled())
            {
                WriteEvent(1, Session, ResourceName, ElapsedMilliseconds);
            }
        }

        public static PerformanceEventSource Log = new PerformanceEventSource();

        private PerformanceEventSource()
        {

        }
    }
}

person Maciej Zawiasa    schedule 14.06.2017    source источник


Ответы (1)


Сначала необходимо было установить манифест, затем вы можете запустить свой EventWriter и собирать данные в любое время при запуске SematicLogger. К сожалению, система выдает ошибку, но пока меня это устраивает.

EventSource .net 4.0 GenerateManifest

person Maciej Zawiasa    schedule 19.06.2017