【问题标题】:Given I'm stuck with SLF4J and java.util.Logging, what is optimal solution?鉴于我坚持使用 SLF4J 和 java.util.Logging,什么是最佳解决方案?
【发布时间】:2013-08-25 19:56:04
【问题描述】:

情况:我们使用带有异步追加器的 SLF4j 和 Log4j 2 问题是我们还使用了使用 java.util.Logging 的 JSF。我看到关于使用jul-to-slf4j 性能的各种令人发指的警告,因为你不能只是放弃java.util.Logging,因为它在JDK 中,因为......这是@987654321 的文档@ 说:

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

请注意,无论如何,使用 SLF4J + java.util.Logging,您会遇到 20% 的性能损失,但您可以通过使用最新版本来放弃 60 倍的提升。

20% 是不可接受的。

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

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

【问题讨论】:

  • 您只能通过使用最新版本的 logback 来放弃 60 倍的增长。由于您使用 Log4j 2 作为具体的日志记录实现,因此在您的情况下并非如此,并且可能是不使用网桥的另一个原因。除此之外,我无法就如何做提供任何建议,因为我有幸不必与 j.u.l 打交道,我希望它保持这种状态。
  • 是的,我看到了,但实际上在文档中更进一步,我发现了一个地方,它说在最近的版本中,来自 logback 的代码被带入了 SLF4J,所以它不再是一个问题.不过仍然坚持 20%。

标签: log4j slf4j java.util.logging


【解决方案1】:

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

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

您可以推出自定义 JSF 实现,可能是通过使用开源实现并将所有 JUL 调用替换为 SLF4J 调用。您将避免性能受到影响,并且不会像替换 JUL 那样困难。您仍然需要维护一个 JSF 分支,尽管如果您限制您的更改,维护分支可能不会太糟糕。它也不会涵盖任何其他调用 JUL 的代码。

【讨论】:

  • 可能会有很多人喜欢这样的分叉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2023-01-29
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
相关资源
最近更新 更多