java - 考虑性能的日志框架

标签 java multithreading java.util.concurrent

我想设计一个日志框架,一个简单但注重性能的框架。

现在,如果一个应用程序有多个线程(例如一次 1000 个线程),并且如果我们像这样编写代码:

MyLogger logger; // Assuming singleton logger for the entire application

当一个线程想要登录文件时,可能有多个线程也想要登录,因此我想到了这种同步:

synchronized(logger) {
    // thread does the logging into file
}

但是这种方法效率不高,因为它强制顺序访问。

我读到了java.util.concurrent.*,我希望这是否能有所帮助,我看到我们有锁概念lock.tryLock(),但是即使如此,这也无济于事。

是否有其他方法可以让多个线程写入日志文件而不影响彼此写入文件的数据?

最佳答案

我会让记录器成为一个类,它有一个要记录的项目的队列。当类使用此记录器时,如 logger.error 我会将内容添加到日志队列中。

Logger 类还应该有自己的线程等待将项目添加到队列中,添加项目时,它应该从队列中弹出该项目并将其记录到文件中。 (您可以在此处使用发布-订阅)。队列应该像 BlockingQueue 变体一样是线程安全的。如果您不仅仅是记录字符串(或不可变对象(immutable对象)),您还必须确保传递给 log 方法的对象不应更改(您可能必须在添加到队列之前克隆它)。如果选择克隆路径,则必须考虑不要很快填满内存。

如果您可以使用外部库 log4j2 具有异步日志功能,这应该会提供出色的性能。

关于java - 考虑性能的日志框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48854148/

相关文章:

java - 在 Java 实体中可选地替换可为空的列

c# - 读取由其他线程上的 Interlocked 更新的 int

java - 锁可中断与锁

java - 执行器服务 : how to prevent thread starvation when synchronization barriers are done in the threads

java - 在多用户 JSP J2EE 应用程序中创建和关闭 ExecutorService 实例

java - 使用从 Activity 扩展的另一个类中的方法

java - 如何将 ArrayList<Vector3f> 转换为 ByteBuffer?

java - 为什么我的列表对象位于内存中?

java - 无法使用下一个代码重现死锁

java - 停止/杀死 Java 中的所有线程