NLog放慢速度并破坏我的ASP.net MVC应用程序

时间:2017-09-01 11:04:08

标签: c# asp.net asp.net-mvc nlog

我有一个用C#编写的库,它执行各种操作并使用NLog进行日志记录。目前,它与WinForms GUI一起使用来操作,一切正常。

我被要求开发一个新的基于网络的界面来替换旧的WinForms界面,并且我选择了ASP.net MVC5

问题是,当我从使用NLog记录内容的库中调用ANY方法时,我的ASP.net应用程序中断:页面之间的加载时间变得非常长(约30秒左右)并且所有状态丢失(TempDataViewData字典被清空。

但是,如果我在该方法中对NLog的所有调用进行了评论后,我从库中调用了相同的方法,那么一切顺利!

为什么会这样?为什么NLog会杀死我的ASP.net MVC应用? 这是NLog配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <targets>
    <target name="logfile" xsi:type="File" fileName="logs\Service.log"  keepFileOpen="false" 
               layout="${longdate} ${level} ${message} ${exception:format=tostring}"
                  archiveFileName="logs\Service.{#}.log"
            archiveEvery="Day"
            archiveNumbering="Rolling"
            maxArchiveFiles="30"
            />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
  </rules>
</nlog>

在你冲破并写出明显的建议之前的重要说明:

  • 我没有做成千上万会减慢应用程序速度的日志。我们&#39;再 谈论最好的15-20对话电话
  • 这仅在登录文件时发生。例如,如果我使用xsi:type =&#34; NLogViewer&#34;
  • 不会出现此问题

3 个答案:

答案 0 :(得分:3)

我认为找到基本目录存在问题,因此完整路径是错误的。

如果在过去之前已经看过这些问题。例如,请参阅this issue

请使用绝对路径或${basedir}

答案 1 :(得分:2)

如果性能非常重要,请考虑将其添加为<targets>中的第一个元素:

<default-wrapper xsi:type="AsyncWrapper" timeToSleepBetweenBatches="0" overflowAction="Block" />

此外,如果您想进一步优化,那么您应该将bufferSize参数添加到logfile-file-target(在keepFileOpen="false"时提高性能):

<target name="logfile" xsi:type="File" fileName="logs\Service.log" bufferSize="4096" ... />

答案 2 :(得分:1)

将此作为进一步澄清,因为Julian的答案确实解决了问题,但我仍然不知道为什么问题正在发生。

从那以后,我发现了,所以在这里:

基本上,通过不指定绝对路径,日志文件正在应用程序工作目录中写入。在ASP.net Web应用程序中,此目录是部署网站的目录。这会产生一个巨大的问题:IIS会不断监视站点的主目录,以便检测更改。当NLog将日志文件写入此目录时,IIS会检测到已更改的文件,将其解释为正在重新部署的站点,并重新启动整个Web应用程序

基本上,在每一个新的日志行中,我的应用程序都是从头开始重新启动的!难怪表现很糟糕!

TL; DR:不要向部署ASP.net网站的顶级目录写任何内容。