Java 登录多线程应用程序

Java 登录多线程应用程序,java,multithreading,Java,Multithreading,我正在用java开发一个交易应用程序(一次处理数百万数据),它是一个广泛的多线程应用程序。应用程序正在日志文件中记录消息。目前,这种日志记录的性能非常低,占用了大量CPU时间 我想重新实现它。我在谷歌上搜索并找到了LinkedBlockingQueue作为选项。由于其大小固定,无法使用arrayBlockingQueue 此外,像log4j这样的框架听起来也是不错的选择,因为它们是线程安全的。但我怀疑log4j是否是多线程应用程序性能方面的好选择 我应该选择什么样的数据结构/框架来在多线程应用程

我正在用java开发一个交易应用程序(一次处理数百万数据),它是一个广泛的多线程应用程序。应用程序正在日志文件中记录消息。目前,这种日志记录的性能非常低,占用了大量CPU时间

我想重新实现它。我在谷歌上搜索并找到了
LinkedBlockingQueue
作为选项。由于其大小固定,无法使用
arrayBlockingQueue

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

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

如果我是你,我会先试试。这只是一个门面,但您可以将其用作实现。如果这样做很慢,那么在那之后就很容易尝试JUL和其他日志框架。这只是一个配置和类路径的更改


如果您尝试的每个记录器都很慢,那么您可能需要查看。但我认为一个伐木工人应该很好。我通常不会听到人们抱怨他们的日志框架如何减慢了他们的应用程序,除非他们打印了过多的调试语句。

尝试log4j 2,而不是重新发明轮子。。。

对于高性能日志记录,我使用(主要是因为我编写了它)它可以以无GC的方式支持每秒100K-1M的文本消息。你可以用锁把它包起来,使它穿线安全。它不像其他伐木工人那样简单,因为它的级别较低,但它是我所知道的最快的

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


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

请不要考虑使用Log4j。。转到回写

Logback是流行的log4j项目的继承者,在log4j停止的地方继续。Logback的体系结构具有足够的通用性,可以在不同的情况下应用。目前,logback分为三个模块,logback核心、logback经典和logback接入

Logback具有您已经准备就绪的appender。被称为AsyncAppender

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

如果已满80%的AsyncAppender在BlockingQueue中缓冲事件,则默认情况下是有损的。由AsyncAppender创建的工作线程从队列头获取事件,并将它们分派给连接到AsyncAppender的单个appender。请注意,默认情况下,如果AsyncAppender的队列已满80%,它将删除级别跟踪、调试和信息的事件。这一策略以事件损失为代价,对性能产生了惊人的有利影响


另请参阅使用经验证的日志框架:它将比您在合理时间内设计的任何东西都更高效……嗨,Peter,您有没有一个使用chronicle编写文本消息的示例?我能找到的每个例子都是用来写二进制数据的。@CaptainHastings IndexedChronicleTest.testParseLines()和TestManyUpdatesMain。看看ByteStringAppender。非常感谢,顺便说一句,编年史真是太棒了@船长黑斯廷斯它可以做一个记录器像接口Hi Peter,我看到你已经开始吸收编年史到slf4j日志接口。您有多线程写入程序的记录器吗?