Java并发日志记录到文件

标签 java logging concurrency error-logging

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

如果我只有一个日志文件,那么线程就会被阻塞,这是对的吗?那么只有一个线程可以写入该文件?

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

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

这是最好的方法吗?我怎样才能实现这个目标?

最佳答案

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

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

关于Java并发日志记录到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192322/

相关文章:

apache - 我的 Apache 日志中奇怪的十六进制条目

java - 使用有界缓冲区(生产者/消费者)是否可以避免同步方法/死锁的痛苦?

java - VBA 中的备忘录实现

Java : split a string that containing special characters

c# - 如何将Azure Function日志发送到blob存储?

node.js - ExpressJS : Include Session ID in every Log statement

java - CGLib - 控制实例创建

java - 在 Java Applet 中读取 XML

Java - 一旦发生 2 个 Callables 中的任何一个错误,就捕获错误

Java Happens-Before 和线程安全