java - 记录器究竟如何是单例以及如何创建不同的日志文件?实现了我自己的记录器以供理解

标签 java oop design-patterns log4j singleton

为了更好地理解调试记录器是如何工作的,我尝试用java实现我自己的记录器。如下面的代码所示。据我了解,记录器通常是单例。我想在应用程序的不同类中使用相同的实例。我使用此记录器的每个类都会记录到不同的文件。但这意味着单例正在被不同的对象变异。这是否会导致将一个类的调试输出不准确地记录到应由另一类记录的文件中。由于同一记录器实例在整个应用程序中共享,那么如何生成不同的文件?它是应用程序中发生变异的同一个实例。因此,我决定将 logFile 位置设置为最终位置,但所有类都会记录到同一个文件。您能解释一下这些好奇心吗?

提前谢谢您。

public class Logger {

    private final String logFile;
    private static Logger instance;

    private Logger(String logFile){
        this.logFile = logFile;
    }

    public Logger getInstance(String logFile){
        synchronized(Logger.class){
            if(instance==null){
                instance = new Logger(logFile);
            }
        }
        return instance;
    }

    public void write(String data) throws IOException{
        PrintWriter out = new PrintWriter (new BufferedWriter(new FileWriter(logFile)));
        out.write(data);
    }

}

最佳答案

如果你想了解记录器的实现,你可以阅读log4j的源代码。但在 log4j 中,记录器不是单例的,有多个实例,它使用存储库和工厂模式。

关于java - 记录器究竟如何是单例以及如何创建不同的日志文件?实现了我自己的记录器以供理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949503/

相关文章:

oop - 具体实现是否应该提供其实现的接口(interface)中不存在的任何公共(public) API?

java - 用于添加功能的继承

java - 从搜索数组的方法返回 boolean 值

java - 在 Java 中将 BigDecimal 字段作为 JSON 字符串值返回

c++ - 从文件中将对象读入数组,反之亦然

design-patterns - 单一职责和混合

java - 库存元素使用的设计模式建议

design-patterns - 设计模式 - 服务层

java - 如何将 Optional<Object> 转换为 Optional<String>

java - Hibernate 中的 BigInteger 映射应该使用什么列类型?