0

我正在开发一个广泛多线程的java交易应用程序(一次数百万个数据)。应用程序正在日志文件中记录消息。目前,此 Logging 的性能相当低,占用大量 CPU 时间。

我想重新实现它。我用谷歌搜索并找到LinkedBlockingQueue了一个选项arrayBlockingQueue。由于它的固定大小而无法使用。

此外,像 log4j 这样的框架听起来也是不错的选择,因为它们是线程安全的。但我怀疑 log4j 是否是多线程应用程序性能方面的好选择。

我应该选择在多线程应用程序中进行日志记录的最佳数据结构/框架是什么?

4

4 回答 4

5

尝试 log4j 2 而不是重新发明轮子... http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html

于 2013-08-28T06:58:19.347 回答
3

对于高性能日志记录,我使用Java Chronicle(主要是因为我编写了它)它可以以更少 GC 的方式支持每秒 100K - 1M 的文本消息。您可以通过用锁包裹它来使其线程安全。它不像其他记录器那样简单,因为它级别较低,但它是我所知道的最快的。

如果您使用二进制日志记录,它每秒可以支持超过 10M 条消息/事件。我正在开发一个速度快 3 倍的 Java Chronicle 2.0。

无界队列通常是一件坏事。如果绑定队列不是您的选择,很可能您遇到了设计问题。如果你真的需要一个无限的,Java Chronicle 可能是你唯一的选择,因为没有其他库真正以高性能的方式支持它。Log4j 2.0 使用有界环形缓冲区。

于 2013-08-28T07:16:45.473 回答
1

甚至不要考虑使用 log4j。请。去logback

Logback 旨在作为流行的 log4j 项目的继承者,在 log4j 停止的地方接手。Logback 的架构足够通用,可以在不同的情况下应用。目前,logback 分为三个模块,logback-core、logback-classic 和 logback-access。

Logback 具有您已经开箱即用的附加程序。被称为AsyncAppender

AsyncAppender 异步记录 ILoggingEvents。它仅充当事件调度程序,因此必须引用另一个附加程序才能执行任何有用的操作。

LOSSY BY DEFAULT IF 80% FULL AsyncAppender 在 BlockingQueue 中缓冲事件。AsyncAppender 创建的工作线程从队列头部获取事件,并将它们分派到附加到 AsyncAppender 的单个 appender。请注意,默认情况下,如果 AsyncAppender 的队列已满 80%,它将丢弃 TRACE、DEBUG 和 INFO 级别的事件。这种策略以事件损失为代价对性能产生了惊人的有利影响。

于 2013-08-28T07:42:04.393 回答
1

如果我是你,我会先尝试slf4j。这只是一个门面,但您可以使用log4j2作为实现。 如果这很慢,那么之后尝试 JUL 和其他日志记录框架将变得非常容易。这只是配置和类路径的更改。

如果您尝试的每个记录器都很慢,您可能需要查看http://zeromq.org/。但我认为记录器应该没问题。我通常不会听到人们抱怨他们的日志框架如何减慢他们的应用程序,除非他们打印出过多的调试语句。

于 2013-08-28T06:56:20.513 回答