如果加了新的日志实现,只需要再扩展一个工厂类就好了。 这就是工厂方法模式。
专门生产控制台日志的工厂: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("这是生产环境日志");
}
}
关键特点
- 遵循工厂方法模式
- 易于扩展(新增日志实现只需添加新的 Logger 和对应的 Factory)
- 符合开闭原则
- 根据环境可以灵活切换日志实现
- FileLogger 实现了基本的文件写入功能,包括时间戳