Log4j 给定I';我坚持使用SLF4J和java.util.Logging,什么是最佳解决方案?

Log4j 给定I';我坚持使用SLF4J和java.util.Logging,什么是最佳解决方案?,log4j,slf4j,java.util.logging,Log4j,Slf4j,Java.util.logging,情况:我们使用SLF4j和Log4j 2来处理异步附加器,问题是我们还使用JSF,它使用java.util.Logging。我看到了关于使用jul-to-slf4j的各种关于性能的令人发指的警告,这是因为您不能仅仅抛弃java.util.Logging,因为它在JDK中,而且。。。下面是网站上的文档说明: “…因此,j.u.l.到SLF4J的转换会严重增加禁用日志语句的成本(60倍或6000%),并显著影响启用日志语句的性能(总体增加20%)。从logback版本0.9.25开始,在LevelC

情况:我们使用SLF4j和Log4j 2来处理异步附加器,问题是我们还使用JSF,它使用
java.util.Logging
。我看到了关于使用
jul-to-slf4j
的各种关于性能的令人发指的警告,这是因为您不能仅仅抛弃
java.util.Logging
,因为它在JDK中,而且。。。下面是网站上的文档说明:

“…因此,j.u.l.到SLF4J的转换会严重增加禁用日志语句的成本(60倍或6000%),并显著影响启用日志语句的性能(总体增加20%)。从logback版本0.9.25开始,在LevelChangePropagator的帮助下,可以完全消除禁用日志语句的60倍翻译开销。“

请注意,不管怎样,使用SLF4J+
java.util.Logging
您都会遇到20%的性能损失,但您可以通过使用最新版本摆脱60倍的增长

20%是不可接受的。

其他想法受到欢迎和鼓励,但我想到的解决方案是不整合
java.util.Logging
。相反,使用一个单独的配置文件,该文件指向与其他文件相同的日志文件。有没有人知道我在哪里可以找到一个例子来说明如何做到这一点,假设这样做并不意味着所有创造的结束


如果有更好的办法,我愿意接受

我认为最佳解决方案是承受20%的性能损失。如果您没有完全替换JUL类,则处理程序是日志记录第一次离开JUL。您还需要编写自己版本的LevelChangePropagator,以便日志4J2中对日志级别的更改(例如重新配置)反映在JUL记录器中。(否则,60次命中将破坏已禁用日志语句的性能。)

您可以用自己的类(直接使用SLF4J或Log4J2)替换JUL类,但由于JUL不在Java认可的标准覆盖机制所涵盖的包列表中,因此您实际上是在谈论在备用JVM上运行或在维护复杂性方面接近它


您可以推出一个定制的JSF实现,可能是采用开源实现并用SLF4J调用替换所有的JUL调用。这样可以避免性能下降,而且不会像替换JUL那样困难。您仍然可以维护一个JSF fork,尽管如果您限制您的更改,那么维护fork可能不会太糟糕。它也不会覆盖调用JUL的任何其他代码。

使用最新版本的logback,您只能放弃60倍的增长。因为您正在使用log4j2作为具体的日志实现,所以在您的情况下不是这样的,这可能是不使用该桥的另一个原因。除此之外,我不能就如何做提供任何建议,因为我有幸还没有和j.u.l打过交道,我希望它保持这种状态。是的,我看到了,但实际上在文档中我发现了一个地方,在最近的版本中,logback中的代码被引入SLF4J,因此不再是问题。但仍然坚持20%。可能会有很多人喜欢这样的叉子。