鉴于我坚持使用SLF4J和java.util.Logging,什么是最佳解决方案?

时间:2013-08-25 19:56:05

标签: log4j slf4j java.util.logging

情况:我们将SLF4j和Log4j 2与异步appender一起使用问题是我们还使用了使用java.util.Logging的JSF。我发现有关使用jul-to-slf4j的性能的各种令人发指的警告,因为你不能放弃java.util.Logging,因为它在JDK中,因为......好的,http://www.slf4j.org/legacy.html上的文件说的是:

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

请注意,无论如何,使用SLF4J + java.util.Logging你会遇到20%的性能下降,但是你可以通过使用最新版本来放弃60倍的增长。

20%是不可接受的。

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

如果有更好的方法,我会对此持开放态度。

1 个答案:

答案 0 :(得分:1)

我认为最佳解决方案是将性能提升20%。如果您没有完全替换JUL类,则Handler是第一次LogRecord离开JUL。您还需要编写自己的LevelChangePropagator版本,以便在Log4J2中对日志级别(例如重新配置)的更改反映在JUL记录器中。 (否则60x命中将杀死禁用日志语句的性能。)

您可以使用自己的(直接使用SLF4J或Log4J2)替换JUL类,但由于JUL不在Java Endorsed Standards Override Mechanism所涵盖的软件包列表中,因此您实际上是在讨论在备用磁盘上运行JVM或维护复杂性接近它。

您可以使用开源源代码并使用SLF4J调用替换所有JUL调用,从而推出自定义JSF实现。你可以避免性能损失,它不会像取代JUL那样困难。你仍然会维护一个JSF分支,虽然如果你限制你的更改,也许保持分叉也不会太糟糕。它也不会涵盖任何其他调用JUL的代码。