Объединительная плата SignalR не работает с конфигурацией NLog (клиенты не могут повторно подключиться)

Мы создали сервер с объединительной платой SQL. Недавно мы обнаружили эту проблему, которая вызвала высокий количество потоков, используемых w3wp.exe. Пройдя всю кодовую базу, мы смогли сузить круг причин, связанных с NLog.

Мы настроили NLog, следуя настройкам в файле веб-конфигурации.

<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>
  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd">
    <targets async="true">

      <target name="file" xsi:type="File" fileName="${basedir}/Logs/${shortdate}_printcloud.log" archiveFileName="${basedir}/Logs/ArchiveAuto/{#}_printcloud.log" archiveDateFormat="yyyy-MM-dd" archiveAboveSize="50000000" archiveEvery="Day" archiveNumbering="DateAndSequence" maxArchiveFiles="14" archiveOldFileOnStartup="false" createDirs="true" layout="${longdate} ${uppercase:${level}}  ${logger} ${message} (${callsite:includSourcePath=true}) ${exception:format=tostring}" />

    </targets>
    <rules>
     <logger name="PrintCloud.*" minlevel="Trace" maxlevel="Error" writeTo="file" />-->

    </rules>
  </nlog>
<configuration>

Внутри концентратора мы использовали регистратор, как показано ниже.

public class ConnectorHub : Hub
{
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

    public void Connect(string message)
    {
        logger.Debug("Connection Recieved");
        (new SignalRHubHelper()).SendConnectRecieved(Context.ConnectionId);
    }
}

Когда мы запускаем объединительную плату с этими включенными конфигурациями, мы сталкиваемся с проблемой использования большого количества потоков, когда клиенты пытаются повторно подключиться. Но если мы закомментируем код конфигурации NLog из файла веб-конфигурации, объединительная плата будет работать отлично. Кто-нибудь сталкивался с подобным поведением при использовании объединительной платы? Что может быть причиной такого поведения?

Версия SignalR — 2.2.2 Версия NLog — 4.4.9

РЕДАКТИРОВАТЬ 1

Проблема, похоже, не возникает, когда мы отключаем ведение журнала трассировки сигнализатора в файле webconfig. Мы использовали NLog.NLogTraceListener для регистрации трассировки сигнализатора.

  <system.diagnostics>
    <sources>
      <source name="SignalR.SqlMessageBus">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.ServiceBusMessageBus">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.RedisMessageBus">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.ScaleoutMessageBus">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.WebSocketTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ServerSentEventsTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.ForeverFrameTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.LongPollingTransport">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.Transports.TransportHeartBeat">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
      <source name="SignalR.ReflectedHubDescriptorProvider">
        <listeners>
          <add name="traces" />
        </listeners>
      </source>
    </sources>
     <!--Sets the trace verbosity level--> 
    <switches>
      <add name="SignalRSwitch" value="Verbose" />
    </switches>
    <sharedListeners>

     <add name="traces" type="NLog.NLogTraceListener, NLog" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>

Вместо использования NLog.NLogTraceListener и использования System.Diagnostics.TextWriterTraceListener вместо этого также не возникает никаких проблем.


person janitha000    schedule 24.05.2017    source источник
comment
Не могли бы вы проверить без архивации? Кроме того, вы пишете много событий? (Я вижу, что уровень трассировки включен)   -  person Julian    schedule 24.05.2017
comment
Да пробовал снимать архивацию но результат тот же. В обычном сценарии у нас более 30 клиентов.   -  person janitha000    schedule 24.05.2017
comment
Хорошо, тогда попробуйте без async (и без архивации)   -  person Julian    schedule 24.05.2017
comment
Пробовал и без асинхронности. Единственное, что, похоже, работает, это изменение правила, в котором имя регистратора = *, а не PrintCloud.*   -  person janitha000    schedule 24.05.2017
comment
это странно. Код для их фильтрации находится здесь (и не использует потоки): github.com/NLog/NLog/blob/.   -  person Julian    schedule 24.05.2017
comment
Я отредактировал свой вопрос.   -  person janitha000    schedule 25.05.2017
comment
Но это также не проблема с <logger name=*..> ?   -  person Julian    schedule 26.05.2017
comment
Да, после комментирования трассировки сигнализатора это заработало и с фильтрацией.   -  person janitha000    schedule 26.05.2017


Ответы (1)


Думаю проблема вот в чем:

autoflush=true

Это приводит к тому, что NLogTraceListener сходит с ума и выполняет сброс для каждого события трассировки. Используя потоки пула потоков, чтобы сбросить все зарегистрированные цели NLog.

Если вам нужен autoflush=true, рассмотрите возможность отключения сброса пула потоков, добавив атрибут disableFlush к слушателю:

<add name="traces" type="NLog.NLogTraceListener, NLog" disableFlush="true" />

Любопытно, почему NLog Wiki рекомендует включать autoflush=true без добавления этого важного атрибута:

https://github.com/NLog/NLog/wiki/NLog-Trace-Listener-for-System-Diagnostics-Trace

Обновление NLog 4.5 теперь использует disableFlush=true по умолчанию. См. также https://github.com/NLog/NLog/pull/2407.

person Rolf Kristensen    schedule 27.05.2017