我有一个用C#编写的库,它执行各种操作并使用NLog
进行日志记录。目前,它与WinForms
GUI一起使用来操作,一切正常。
我被要求开发一个新的基于网络的界面来替换旧的WinForms
界面,并且我选择了ASP.net MVC5
。
问题是,当我从使用NLog
记录内容的库中调用ANY方法时,我的ASP.net应用程序中断:页面之间的加载时间变得非常长(约30秒左右)并且所有状态丢失(TempData
和ViewData
字典被清空。
但是,如果我在该方法中对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>
在你冲破并写出明显的建议之前的重要说明:
答案 0 :(得分:3)
答案 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网站的顶级目录写任何内容。