log4net:在同一个RollingFileAppender中为不同类型的消息指定不同的布局

时间:2011-03-28 02:15:42

标签: c# .net logging log4net

显然是two RollingFileAppenders cannot write to the same file(或者自从改变了吗?)。

那么如何将一个布局的信息消息与另一个布局的异常一起写入同一个滚动区块?是否可以在同一个appender中指定两个不同的布局,还是有其他解决方案?

2 个答案:

答案 0 :(得分:3)

尝试将以下元素添加到FileAppender / RollingFileAppender元素中 每个XML配置文件:

<param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />

我正在使用它将许多基于log4net的可执行文件记录到单个文件中。

答案 1 :(得分:2)

这不是(File)Appender的问题,而是它背后的LockingModel的更多问题。

正如“随机”所说,您可能会使用MinimalLock,但请注意,它有两个主要缺点:

  • 与ExclusiveLock相比,性能相当差,因为每次写入的消息都会获取/释放文件锁。
  • 它只是防止两个进程同时写入。可能仍会发生多个进程尝试写入单个文件的情况。在这种情况下,实际上只会授予一个,其他所有人都会收到错误并且他们的消息会丢失(另请参阅here)。

为了避免这种情况,您可以编写自己的内部使用互斥锁的LockingModel。这是(a)比MinimalLock的文件锁定更快,并且(b)仍然允许所有进程最终写出他们的消息(即使是thouhg,当然,意思是变异排斥)。我有一个实现,我很遗憾无法分享,因为它来自客户的项目。但是提出一个实现应该不会太难(他们可能是一个在网上,但我还没有找到它。)

修改:此mailing list thread中有一个实施。就个人而言,我还没有使用它,所以我不知道它是否有效,但看起来还不错。

更新:恰好注意到原始问题的“不同布局”部分。我想使用两种不同的布局不可能有一个appender。除布局外,您可以使用两个配置相同的appender。然后让他们使用自定义lockingModel或MinimalLock - YMMV写入同一文件。但是,我真的不会这样做。在同一个日志文件中有两个布局(格式!),这使得解析或日志分析变得不必要。为什么不首先有两个文件呢?