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

问题描述

我有一个运行 IIS 10 的 ASMX Web 服务,并使用以下配置将 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 的最大文件大小。

Two log4net log files per day

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

enter image description here

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

这些是 IIS 回收设置

IIS Settings

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

更新

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

解决方法

<appender name="AsmxDebugLogFile" type="log4net.Appender.RollingFileAppender">
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

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

,

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

这是我的参数与你的不同:

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

这里的行为会有所不同:

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

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

  • MinimalLock 的角色对我来说不太清楚,但我还是应该提一下:

为每个 AcquireLock()/ReleaseLock() 循环打开文件一次,从而在最短的时间内保持锁定。这种锁定方法比 FileAppender 慢得多。 ExclusiveLock 但允许其他进程在日志记录继续时移动/删除日志文件。

,

试试这个参数。

Cannot resolve symbol 'colorBackground'
,

您正在使用“RollingFileAppender”,顾名思义,它会根据日期滚动到新文件,请尝试使用 FileAppender,有关如何使用 FileAppender 的更多信息,请参阅此链接:FileAppender。>