我一直在抓住Stack和网络来解决我的特定用例,但还没有找到一个。
Log4Net 1.2.10 IIS 6.1 使用CastleCore的.NET应用程序
我的要求是根据每小时的进程ID创建一个唯一的文件名,文件名中包含进程ID,日期和小时。虽然如果进程ID在该小时内更改,则根据进程ID和日期/小时创建新文件名。
我在IIS中的Web场上运行服务,这有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参数的设置,尽管该文件仍然会被重命名,但不会在扩展后。< / p>
我看到的一个建议是将IIS池设置禁用重叠回收设置为false,但这并没有任何区别,只会在应用池的回收中发挥作用。
另一个替代方案是将两个进程从每个应用程序池转换为单个日志文件,尽管由于写入量的原因,我认为如果没有进一步的进程冲突,此解决方案将无法工作。
如果我错过了某些内容,或者有人在当前或以后的log4net版本中使用过此版本,请提供任何帮助。