问题描述
我的aps.net核心应用程序运行良好,并且每天都在生成日志并进行滚动,但是,一旦我将新版本的应用程序部署到IIS,它就会停止日志记录并且也停止滚动。仅当我将当前日志文件重命名为其他名称时,它才会再次开始。但随后它又按预期工作。
部署涉及通过在应用程序根文件夹中创建app_offline.htm
文件来停止应用程序。
该应用程序在dot.net core 2.2.8上运行,log4net版本为2.0.10。
这是我的RollingFileAppender的精髓
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="<some absolute path>\Log.txt"/>
<appendToFile value="true" />
<staticLogFileName value="true" />
<rollingStyle value="Date" />
<datePattern value=" yyyy-MM-dd" />
<threshold value="All" />
<layout type="log4net.Layout.PatternLayout">
<!--<conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />-->
<conversionPattern value="%property{log4net:HostName} %date [%thread] %-5level %logger - %message%newline%exception" />
</layout>
</appender>
您知道什么可能导致此行为吗?
Windows日志:
在Windows日志中,我可以找到此错误(但并非总是如此):
IISMANAGER_CRASH
IIS Manager terminated unexpectedly.
Exception:System.Runtime.Remoting.RemotingException: Cannot call disconnect on a proxy.
at System.Runtime.Remoting.RemotingServices.disconnect(MarshalByRefObject obj,Boolean bResetURI)
at System.Web.Hosting.ApplicationManager.HostingEnvironmentShutdownComplete(String appId,IApplicationHost appHost)
at System.Web.Hosting.ApplicationManager.HostingEnvironmentShutdownComplete(String appId,IApplicationHost appHost)
at System.Web.Hosting.HostingEnvironment.OnAppDomainUnload(Object unusedobject,EventArgs unusedEventArgs)
Process:InetMgr
我还注意到另一个应用程序由于部署而关闭,因为它具有相同的物理根。这可能是问题吗?我应该在关闭应用程序(通过创建app_offline.htm
)和部署之间添加延迟吗?
第二个应用程序的一部分与开发部署有所不同(没有问题)。
解决方法
问题是第二个具有相同物理地址的应用程序。由于它使用相同的根文件夹,因此它也使用相同的log4net-config。这意味着两个进程要登录到同一文件。 LockingModel
中的FileAppender
成为焦点。
文档状态
The default locking model is the
FileAppender.ExclusiveLock
.
还有FileAppender.ExclusiveLock
国的文档
这会导致两个进程也争夺对同一文件的独占外观(我希望如果一个进程打开了文件,则只有在进程结束(即IIS对其进行回收)时,它才会关闭)。
解决方案是使用提供跨进程文件锁定的FileAppender.InterProcessLock
。
要使用它,我们只需将此xml代码添加到appenders配置中即可:
<lockingModel type="log4net.Appender.FileAppender+InterProcessLock" />