部署后log4net RollingFileAppender停止工作

问题描述

我的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国的文档

Open the file once for writing and hold it open until CloseFile() is called. Maintains an exclusive lock on the file during this time.

这会导致两个进程也争夺对同一文件的独占外观(我希望如果一个进程打开了文件,则只有在进程结束(即IIS对其进行回收)时,它才会关闭)。

解决方案是使用提供跨进程文件锁定的FileAppender.InterProcessLock

要使用它,我们只需将此xml代码添加到appenders配置中即可:

<lockingModel type="log4net.Appender.FileAppender+InterProcessLock" />