Java并发记录到文件

时间:2014-10-04 11:23:10

标签: java logging concurrency error-logging

我正在编写一个记录器(例如使用java记录器),我可以使用该记录器将活动(信息,错误)记录到文件中。这个(静态)记录器类由多个线程和进程使用。

如果我只有一个日志文件,则线程被阻塞,这是对的吗?所以只有一个线程可以写入文件吗?

另一种解决方案是为每个线程提供一个自己的日志文件,但这会有点混乱。

因此,我首先考虑将日志保存在一个流中(可能是每个线程一个),并且只在程序结束时将所有内容写入文件。

这是最好的方法吗?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以尝试在程序结束时将所有内容写入文件,但这可能会占用大量内存,并且通常还需要实现记录器,这样他们仍然可以记录大部分/全部数据以防万一程序崩溃或其他意外终止。

作为替代方案,您可以使用并发队列来记录消息,例如: a LinkedBlockingQueueConcurrentLinkedQueue,其中多个线程将其消息写入队列,并且单个线程从队列中读取并将消息写入文件。使用BlockingQueue日志记录线程可以在队列上调用takepoll(timeout, TimeUnit),从而使线程休眠直到消息可用;使用ConcurrentLinkedQueue,您可以让日志记录线程休眠10秒,然后唤醒,将队列刷新到文件,然后再回到睡眠状态10秒钟。在任何一种情况下,生成记录消息的线程都不会阻塞。