如何在多线程环境中异步记录?

时间:2013-01-15 14:43:27

标签: java multithreading logging asynchronous locking

我试图在Linux平台上的java中的多线程环境中异步记录。什么是合适的数据结构(无锁)以引入低线程争用? 我需要记录GB的消息。我需要以异步/无锁方式执行此操作,因此我不会破坏主逻辑(调用记录器apis的代码)的性能。

5 个答案:

答案 0 :(得分:2)

Logback有一个可能满足您需求的AsyncAppender。

答案 1 :(得分:1)

最简单的方法是写入多个文件 - 每个线程一个。

确保将时间戳放在每条记录的开头,这样就可以更容易地将它们合并到一个日志文件中。

示例unix命令:

cat *.log | sort | less

但是,为了获得更好/更有用的答案,您需要通过添加更多细节来澄清您的问题。

答案 2 :(得分:1)

我会使用Java Chronicle,主要是因为我写了它,但我在这里建议,因为你可以用最少的操作系统调用来编写无锁和无垃圾的日志记录。这需要每个线程一个日志,但是你已经将这些记录保持在最低限度。

我已经使用这个库从两个线程写入1 GB /秒。如果日志记录对你来说是个瓶颈,你可能会发现有更多的线程无法帮助你。

BTW:您已经了解了如何从多个线程/进程更新日志,但实现和测试需要一段时间。

答案 3 :(得分:0)

为了减少争用,您可以先将日志消息放入缓冲区,对每个线程都是私有的。当缓冲区已满时,将其放入由单独的日志线程处理的队列中,然后该线程合并来自不同线程的消息并将它们写入文件。注意,在任何情况下都需要单独的线程,以便在将下一个缓冲区写入磁盘时不会减慢工作线程的速度。

答案 4 :(得分:0)

不可能以避免队列争用,因为您的日志记录线程很可能比您的编写器(磁盘I / O)线程更快地记录,但是有一些智能等待策略和线程固定你可以最大限度地减少延迟并最大化吞吐量。

查看使用CoralLog的Coral Blocks(我所属的)开发的lock-free queue,并且可以平均记录52纳秒的64字节消息。它每秒能够写入超过500万条消息。

相关问题