1

我一直在 Stack 和网络上寻找针对我的特定用例的解决方案,但还没有找到。

使用 CastleCore 的 Log4Net 1.2.10 IIS 6.1 .NET 应用程序

我的要求是根据每小时的进程 ID 创建一个唯一的文件名,文件名中包含进程 ID、日期和小时。尽管如果进程 ID 在该小时内发生更改,则根据该进程 ID 和日期/小时创建一个新文件名。

我有一个在 IIS 的网络场上运行的服务,它有 4 个工作进程同时运行,2 个应用程序池每个池 2 个进程。所以4个日志文件也同时被写入。

我当前的配置(如下)似乎可以正常工作。文件被创建并同时记录,太棒了!日志记录非常繁重,因为在一个小时的过程中,每个进程 ID 将记录大约 200MB。

在一个小时的过程中,两个文件中的一个只是停止写入。我已经设置了最小锁和不同的进程 ID,这应该可以防止任何死锁、竞争条件或冲突。

我当前的配置如下

<appender name="WSG_file_appender" type="WSG.Logger.LogAppender,WSG.Logger">
<file type="log4net.Util.PatternString" value="../../WSG/IWSGServices-[%processid]" />
  <datePattern value="-dd.MM.yyyy-HH'.log'" />
  <staticLogFileName value="false"/>
  <rollingStyle value="Date" />
  <appendToFile value="true" />
  <maximumFileSize value="500MB" />
  <maxSizeRollBackups value="50" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="[%d] [%t] %-5p [%m]%n" />
  </layout>

生成的日志格式为:IWSGServices[8977]-23.03.15.14.log

这就是我想要的,在上面的示例中,它是进程 ID 8977 的 1400 小时的日志。为每个正在使用的进程 ID 和新的小时戳生成 1500 个新日志。

当日志记录在 log4net 调试模式下停止时,我多次收到此错误:

log4net:ERROR [LogAppender] Failed to write [].
System.ArgumentOutOfRangeException: Count cannot be less than zero.
Parameter name: count
at System.String.CopyTo(Int32 sourceIndex, Char[] destination, Int32         destinationIndex, Int32 count)
at System.IO.StreamWriter.Write(String value)
at log4net.Util.QuietTextWriter.Write(String value)

我在 log4net 中没有发现任何类似的此错误案例,因此用例有限。我怀疑存在一些 I/O 问题或 log4net(至少是这个旧版本)无法满足我的用例。但是,我不相信最新版本也会如此。由于报告了更高版本和 Castle Core 实现的问题,我还没有升级 log4net。

设置 StaticLogFileName=true 会导致创建不带日期戳的文件名,即 WSGServices[8699],然后在每小时重命名为 IWSGServices[8977]-23.03.15.14.log。这不是我想要的,因为对于这个用例,我不希望文件被重命名,因为我有一个日志阅读器,它将它视为一个新文件并再次解析它。

我尝试了很多组合,包括有无锁定模型、滚动样式、日期模式,上面的配置似乎是我最接近的。如果我每分钟滚动一次,这个配置可能会起作用,但这会导致每天超过 3000 个日志文件,这是不切实际的。

我想在我正在使用的当前版本的 log4net 下实现这一点,但是如果我修补到 2.11,则会设置 PreserveLogFileNameExtension 参数,尽管文件仍会被重命名,但不会在扩展名之后。

我看到的一个建议是将 IIS 池设置禁用重叠回收设置为 false 但这没有任何区别,因为只会在应用程序池的回收中发挥作用。

另一种选择是将每个应用程序池中的两个进程都记录到单个日志文件中,尽管由于写入量的原因,我认为如果没有进一步的进程冲突,该解决方案将无法工作。

如果我遗漏了什么,或者如果有人在当前或更高版本的 log4net 中使用过它,任何帮助表示赞赏。

4

0 回答 0