为什么我使用带有 ASMX Web 服务的 log4net 每天会收到两个日志文件?

Why am I getting two log files per day using log4net with ASMX web service?

我有一个 ASMX 网络服务 运行 IIS 10 并已将 log4net 添加到具有以下配置的项目中:

<appender name="AsmxDebugLogFile" type="log4net.Appender.RollingFileAppender">
  <file value="App_Data/ASMX.DEBUG_" type="log4net.Util.PatternString" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <datePattern value="yyyy-MM-dd'.log'" />
  <maximumFileSize value="5GB" />
  <staticLogFileName value="false" />
  <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>

但出于某种原因,我每天收到两个格式为 yyyy-MM-dd.log.yyyy-MM-dd.log 的日志文件,如下面的屏幕截图所示,似乎也是随机的,日志文件将切换到新的创建日志文件,然后将在相关当天午夜创建的日志文件中再次开始记录。所有日志文件也远低于 5GB 的最大文件大小。

下面是更新的日志文件列表

似乎最初,log4net 记录到文件 yyyy-MM-dd.log,然后在随机时间后创建一个新的日志文件 yyyy-MM-dd.log.yyyy-MM-dd.log 开始写入该日志文件并然后返回并记录到当天开始时创建的 yyyy-MM-dd.log

这些是 IIS 回收设置

我想要每天 1 个格式为 ASMX.DEBUG_yyyy-MM-dd.log 的日志文件。这个配置哪里出错了?

更新

好像是因为我们是每60分钟回收一次应用程序池,这取决于此时是否正在写入日志文件,取决于是否创建了新的。关于如何克服这个问题的任何建议。现在我已经在日志文件名中添加了 process_id 并且它似乎可以工作,因为我每小时都会创建一个新的日志文件,但理想情况下我每天只需要 1 个日志文件。

试试这个参数。

  <param name="File" value="C:\YourLogFilePath\" />
  <rollingStyle value="Composite" />
  <param name="DatePattern" value="dd.MM.yyyy'.log'" />
  <param name="AppendToFile" value="true" />
  <maxSizeRollBackups value="2" />
  <maximumFileSize value="5GB" />
  <staticLogFileName value="false" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<appender name="AsmxDebugLogFile" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

我认为您需要锁定模型,它不会锁定您的 file.I 认为主文件创建并锁定时。 File appender 在现有文件上创建具有相同日期时间戳的文件名。 您还应该使用远程路径进行日志记录,例如 \\server\file\debug,因为您可能有用于 IIS 的负载平衡器或使用静态 IP 或 F5 托管 Web 服务器。

您正在使用“RollingFileAppender”,顾名思义,它会在日期滚动到新文件,请尝试使用 FileAppender,有关如何使用 FileAppender 的更多信息,您可以参考此link:FileAppender.

我的所有应用程序都使用 log4net,我从未遇到过在池回收后重新创建文件的情况。

这是我的参数,与您的不同:

<appendToFile value="true"/>
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

以下是行为的不同之处:

  • staticLogFileName 表示当天的文件名将始终相同(此处为 ASMX.DEBUG_.log)。之后的日期会自动重命名为日期模式
  • appendToFile 表示它不会覆盖当天的文件,而是附加到它。

我认为前两个参数将避免为当天创建多个文件,这可能会解决您的问题。

  • MinimalLock的作用我不太清楚,但我还是要提一下:

Opens the file once for each AcquireLock()/ReleaseLock() cycle, thus holding the lock for the minimal amount of time. This method of locking is considerably slower than FileAppender. ExclusiveLock but allows other processes to move/delete the log file whilst logging continues.