日志工厂实现

124 阅读2分钟

如果加了新的日志实现,只需要再扩展一个工厂类就好了。 这就是工厂方法模式。

专门生产控制台日志的工厂:ConsoleLoggerFactory和FileLoggerFactory,用于生产不同的日志记录器。

本地开发调试,只需要将日志输出到控制台就好了,无需持久化存储。

线上环境,没人会盯着日志去看,所以需要将日志写入磁盘文件。

日志工厂实现

1. 首先创建日志记录器接口

ILogger.java
 
public interface ILogger {
    void info(String message);
    void error(String message);
    void debug(String message);
    void warn(String message);
}

2. 实现具体的日志记录器

ConsoleLogger.java
 
public class ConsoleLogger implements ILogger {
    @Override
    public void info(String message) {
        System.out.println("[INFO] " + message);
    }

    @Override
    public void error(String message) {
        System.err.println("[ERROR] " + message);
    }

    @Override
    public void debug(String message) {
        System.out.println("[DEBUG] " + message);
    }

    @Override
    public void warn(String message) {
        System.out.println("[WARN] " + message);
    }
}
FileLogger.java
 
public class FileLogger implements ILogger {
    private String fileName;

    public FileLogger(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void info(String message) {
        writeLog("INFO", message);
    }

    @Override
    public void error(String message) {
        writeLog("ERROR", message);
    }

    @Override
    public void debug(String message) {
        writeLog("DEBUG", message);
    }

    @Override
    public void warn(String message) {
        writeLog("WARN", message);
    }

    private void writeLog(String level, String message) {
        try (FileWriter fw = new FileWriter(fileName, true);
             BufferedWriter bw = new BufferedWriter(fw)) {
            String log = String.format("[%s] %s - %s%n", 
                level, 
                LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME), 
                message);
            bw.write(log);
        } catch (IOException e) {
            System.err.println("Failed to write to log file: " + e.getMessage());
        }
    }
}

3. 创建日志工厂接口

LoggerFactory.java
 
public interface LoggerFactory {
    ILogger createLogger();
}

4. 实现具体的工厂类

ConsoleLoggerFactory.java
 
public class ConsoleLoggerFactory implements LoggerFactory {
    @Override
    public ILogger createLogger() {
        return new ConsoleLogger();
    }
}
FileLoggerFactory.java
 
public class FileLoggerFactory implements LoggerFactory {
    private String fileName;

    public FileLoggerFactory(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public ILogger createLogger() {
        return new FileLogger(fileName);
    }
}

5. 使用示例

LoggerDemo.java
 
public class LoggerDemo {
    public static void main(String[] args) {
        // 开发环境使用控制台日志
        LoggerFactory devFactory = new ConsoleLoggerFactory();
        ILogger devLogger = devFactory.createLogger();
        devLogger.info("这是开发环境日志");
        
        // 生产环境使用文件日志
        LoggerFactory prodFactory = new FileLoggerFactory("app.log");
        ILogger prodLogger = prodFactory.createLogger();
        prodLogger.info("这是生产环境日志");
    }
}

关键特点

  1. 遵循工厂方法模式
  2. 易于扩展(新增日志实现只需添加新的 Logger 和对应的 Factory)
  3. 符合开闭原则
  4. 根据环境可以灵活切换日志实现
  5. FileLogger 实现了基本的文件写入功能,包括时间戳