我什么时候需要在 ASMX 服务中指定 log4net.Appender.FileAppender.LockingModel

问题描述

我们有一个项目,其中包含 3 个不同的 ASMX 服务文件,例如 Service1.asmxService2.asmxService3.asmx,所有这些文件都在同一个应用程序池中运行。

我们刚刚开始使用 log4net 来记录我们的请求和响应,它似乎在同一个日志文件中正确记录了每个服务的每个请求和响应(这正是我们想要的)。

但是,在阅读 log4net 配置示例时,我看到了一些使用 log4net.Appender.FileAppender.LockingModel 的示例。

我需要在我的场景中考虑这一点吗?这是我当前的代码

   public class Global : System.Web.HttpApplication
   {
        public static readonly log4net.ILog asmxDebugLog = log4net.LogManager.GetLogger("AsmxDebugLogFile");
    
        protected void Application_Start(object sender,EventArgs e)
        {   
            log4net.Config.XmlConfigurator.Configure();     
        }  
   }  

在我的 web.config 文件

  <configuration>
     <configSections>
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
   </configSections>

  <log4net debug="true">
      <appender name="AsmxDebugLogFile" type="log4net.Appender.RollingFileAppender">
        <file value="App_Data/log4net_ASMX.DEBUG_"  type="log4net.Util.PatternString"  />
        <appendToFile value="true" />
        <rollingStyle value="Composite" />
        <datePattern value="yyyy-MM-dd'.log'" />
        <staticLogFileName value="false" />
        <maximumFileSize value="5GB" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
        </layout>
      </appender>
      <logger name="AsmxDebugLogFile">
        <level value="DEBUG" />
         <appender-ref ref="AsmxDebugLogFile" />
       </logger>
    </log4net>
  </configuration>

我们是这样记录的

  asmxDebugLog.Debug("Log something useful");

解决方法

当记录器并不都在一个进程中时,您才真正需要关心锁定,对您来说,它们似乎是(1 个应用程序池 ~= 1 个进程)。

速度最快的 default locking mode is 'exclusive',因此您无需(或不想)更改它(并减慢速度)。

如果您稍后将服务拆分为不同的应用程序池,则可以选择 InterProcess(如果都在同一台机器上)或 Minimal