[英]SignalR Backplane not working with NLog configuration (Clients cannot reconnect)
我們已經創建了帶有SQL背板的服務器。 最近,我們發現此問題導致w3wp.exe大量使用線程。 遍歷整個代碼庫后,我們可以縮小原因與NLog的關系。
通過在Web配置文件中進行以下配置,我們已經配置了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);
}
}
當我們在啟用這些配置的情況下運行背板時,當客戶端嘗試重新連接時,我們將面臨大量線程使用的問題。 但是,如果我們從Web配置文件中注釋掉NLog配置代碼,則背板可以正常工作。 使用背板時,有沒有人遇到過類似的行為? 這種行為可能是什么原因?
SignalR versoin-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
似乎也沒有出現任何問題。
認為問題是這樣的:
autoflush=true
這將導致NLogTraceListener變為瘋子並為每個跟蹤事件執行刷新。 通過使用線程池線程刷新所有已注冊的NLog目標。
如果需要autoflush=true
,請考慮通過向偵聽器添加disableFlush
屬性來禁用autoflush=true
刷新:
<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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.