Search code examples
etwsemantic-logging

SemanticLogging throws Exception in Command Processing for EventSource


On some machines (probably only on Windows 7 and 2008 R2 but not on Windows 10) I have problem using SemanticLogging. When I run it I'm receiving fallowing output:

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.;

All that happens in specific scenerio:

  1. I'm starting process which writes Events
  2. then I run SemanticLogging-svc.exe -c
  3. after few moments error occurs

But when I change order and first start SemanticLogging-svc.exe and after that I run "event writer", everything goes how it should.

But when I setup all as described in first scenerio and after error I will try to collect data using PerfView magic happens and SemanticLogging starts collecting data.

Using PerfView I have checked Microsoft-SemanticLogging-Etw source but nothing there.

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());
        }

    }
}

EventSource:

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()
        {

        }
    }
}

Solution

  • It was necessary to install manifest first, then you can start your EventWriter and you can collect data any time you start SematicLogger. Unfortunately system throws error but for now I'm good with that.

    EventSource .net 4.0 GenerateManifest