为什么我使用带有 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.
我有一个 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.