【问题标题】:log4net: Specifying different layouts for different kinds of messages in the same RollingFileAppenderlog4net:在同一个 RollingFileAppender 中为不同类型的消息指定不同的布局
【发布时间】:2023-03-04 15:10:02
【问题描述】:

显然是two RollingFileAppenders cannot write to the same file(或者从那以后它发生了变化?)。

那么,我如何将一种布局的信息消息和另一种布局的异常写入同一个滚动磁贴?是否可以在同一个 appender 中指定两个不同的布局,或者有其他解决方案吗?

【问题讨论】:

    标签: c# .net logging log4net


    【解决方案1】:

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

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

    我正在使用它从许多 log4net 驱动的可执行文件记录到单个文件。

    【讨论】:

      【解决方案2】:

      这实际上不是 (File)Appender 的问题,而是它背后的 LockingModel 的问题。

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

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

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

      编辑:在这个mailing list thread 中有一个实现。就个人而言,我没有使用它,所以我无法判断它是否有效,但它看起来不错。

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

      【讨论】:

      • 感谢您的详尽回答。令我困惑的是:我是否必须复制appender的所有参数,例如rollingStylemaximumFileSize?写两次听起来真的很愚蠢,因为一个文件不能同时具有 100KB 和 200KB 的最大大小。如果将来有人试图更改其中一个参数而不知道它们在两个附加程序之间重复,会发生什么?这个问题可以解决吗?
      • @Ilya Kogan:我猜如果您有两个(不同配置的)附加程序写入同一个文件,那么无论附加程序首先触发滚动,都会通过其配置来执行。如果具有 100KB 的 A1 很少写入,它将永远不会看到 100KB 的限制,而具有 200KB 的 A2 可能。如果 A1 经常写入,有效的文件将滚动 100KB,因为 A2 永远不会看到 200KB 的限制。我们将 log4net 配置放在一个单独的文件中,该文件在组件之间共享,以确保它们使用相同的设置(更多信息请参见 logging.apache.org/log4net/release/manual/configuration.html)。
      • @Ilya Kogan:Ups,刚刚看到“不同的布局”部分。我想如果你真的想要这样做,你必须复制你的 appender 配置(包括 rollingStyle/maximumFileSize),因为布局是它的嵌入部分 - 或者你使用 log4net API 以编程方式配置你的 appender .
      • 这很奇怪...用两种不同的布局写入同一个文件在我看来是一个非常合理的场景,我很惊讶没有人想到这一点...谢谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2013-09-04
      相关资源
      最近更新 更多