Log4netTraceListener для веб-приложения SignalR зависает - PullRequest
0 голосов
/ 04 августа 2020

В моем приложении SignalR Server я хотел записывать все трассировки SignalR в свой журнал 4net файл журнала и следовал принятому ответу Дирк Воллмар в Как записывать сообщения трассировки в журнал 4net ? .

Это работает: трассировки SignalR были записаны в мой журнал 4net файл журнала. Когда подключается новый клиент SignalR, я вижу подробные журналы, которые мне нужны.

НО: после подключения нескольких клиентов к серверу, производящего некоторый трафик c, все серверное приложение начинает зависать.

Когда я приостановил свое приложение в Visual Studio, я заметил много рабочих потоков: TraceEvent worker threads

Many of these worker threads for System.Diagnostics.TraceSource.TraceEvent are [Waiting on lock owned by Thread xyz]. So they seem to lock eachother?

The big question: How can I log all my SignalR trace events without blocking?

Implementation: See Log4netTraceListener

Конфигурация в web.config:

  <system.diagnostics>
    <sources>
      <source name="SignalR.SqlMessageBus">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.ServiceBusMessageBus">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.RedisMessageBus">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.ScaleoutMessageBus">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.Transports.WebSocketTransport">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ServerSentEventsTransport">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ForeverFrameTransport">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.Transports.LongPollingTransport">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.Transports.TransportHeartBeat">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
      <source name="SignalR.ReflectedHubDescriptorProvider">
        <listeners>
          <add name="SignalR-Log4netTraceListener" />
        </listeners>
      </source>
    </sources>

    <switches>
      <!--
      ================================
      Set the trace verbosity level:
      ================================
      0: Off      Output no tracing and debugging messages.
      1: Error    Output error-handling messages.
      2: Warning  Output warnings and error-handling messages.
      3: Info     Output informational messages, warnings, and error-handling messages.
      4: Verbose  Output all debugging and tracing messages. -->

      <add name="SignalRSwitch" value="Verbose" /> 
      <!-- Note: Also hanging when using "Warning"-level -->
    </switches>
    
    <!--Specifies the trace writer for output-->
    <sharedListeners>
      <!--Listener for all events-->
      <add name="SignalR-Log4netTraceListener" type="MySignalRServerApp.Log4netTraceListener, MySignalRServerApp" />
    </sharedListeners>

    <!-- Note: autoflush="false" makes no difference, still hanging -->
    <trace autoflush="true" />

  </system.diagnostics>
...