Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# log4net:在同一个RollingFileAppender中为不同类型的消息指定不同的布局_C#_.net_Logging_Log4net - Fatal编程技术网

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

C# log4net:在同一个RollingFileAppender中为不同类型的消息指定不同的布局,c#,.net,logging,log4net,C#,.net,Logging,Log4net,显然(或者从那以后它有没有改变?) 那么,如何将一个布局的信息消息和另一个布局的异常信息都写入同一个滚动磁贴呢?是否可以在同一个appender中指定两个不同的布局,或者是否有其他解决方案?尝试将以下元素添加到的FileAppender/RollingFileAppender元素中 每个XML配置文件: <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> 我正在使用它将许多

显然(或者从那以后它有没有改变?)


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

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

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


我正在使用它将许多支持log4net的可执行文件记录到一个文件中。

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

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


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

这实际上不是(文件)附加器的问题,而是它背后的锁定模型的问题

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

  • 与ExclusiveLock相比,性能相当差,因为每次写入的消息都会获取/释放文件锁
  • 它只是防止两个进程同时写入。仍然可能有多个进程试图写入单个文件。在这种情况下,实际上只授予一个权限,其他所有权限都会出错,并且它们的消息会丢失(另请参阅)
为了避免这种情况,您可以编写自己的内部使用互斥的代码。这(a)比MinimalLock的filelocking更快,(b)仍然允许所有进程最终写入消息(当然,即使是thouhg,正如预期的那样,也是相互排斥的)。很遗憾,我有一个无法共享的实现,因为它来自客户的项目。但是要想实现它应该不太难(他们的实现可能在web上,但我现在还找不到)

编辑:这是一个实现。就我个人而言,我还没有使用过它,所以我无法判断它是否有效,但它看起来还可以


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

这实际上不是(文件)附加器的问题,更重要的是它背后的锁定模型

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

  • 与ExclusiveLock相比,性能相当差,因为每次写入的消息都会获取/释放文件锁
  • 它只是防止两个进程同时写入。仍然可能有多个进程试图写入单个文件。在这种情况下,实际上只授予一个权限,其他所有权限都会出错,并且它们的消息会丢失(另请参阅)
为了避免这种情况,您可以编写自己的内部使用互斥的代码。这(a)比MinimalLock的filelocking更快,(b)仍然允许所有进程最终写入消息(当然,即使是thouhg,正如预期的那样,也是相互排斥的)。很遗憾,我有一个无法共享的实现,因为它来自客户的项目。但是要想实现它应该不太难(他们的实现可能在web上,但我现在还找不到)

编辑:这是一个实现。就我个人而言,我还没有使用过它,所以我无法判断它是否有效,但它看起来还可以


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

谢谢你的详细回答。让我困惑的是:我是否必须复制appender的所有参数,例如
rollingStyle
maximumFileSize
?写两次听起来很愚蠢,因为一个文件不能同时有100KB和200KB的最大大小。如果将来有人试图更改其中一个参数而不知道它们在两个附加器之间重复,会发生什么情况?这个问题可以解决吗?@Ilya Kogan:我想如果有两个(不同配置的)appender写入同一个文件,那么无论哪个appender首先触发roll,都会根据其配置执行。如果100KB的A1很少写入,它将永远不会看到100KB限制发生,而200KB的A2可能会发生。如果A1经常写,文件将有效地滚动100KB,因为A2永远看不到200KB的限制。我们已经将log4net配置放在一个单独的文件中,该文件在组件之间共享,以确保它们使用相同的设置(更多信息)。@Ilya Kogan:Ups,刚刚看到了“不同的布局”部分。我想如果你真的想这样做,你必须复制你的appender配置(包括rollingStyle/maximumFileSize),因为布局是它的一个嵌入部分——或者你使用log4net API以编程方式配置你的appender。这很奇怪。。。在我看来,用两种不同的布局写入同一个文件似乎是一种非常合理的方案,我很惊讶没有人想到这一点。。。谢谢你的帮助!谢谢你详尽的回答。让我困惑的是:我是否必须复制appender的所有参数,