为了实现日志级别过滤和日志轮转功能,我们可以扩展之前的简单日志框架。以下是一个更完整的示例,它包括了日志级别过滤和日志轮转的支持。
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class EnhancedLogging {
private static final Logger logger = new Logger();
public static void log(Level level, String message) {
if (logger.isLoggable(level)) {
logger.log(level, message);
}
}
public enum Level {
DEBUG,
INFO,
WARN,
ERROR
}
private static class Logger {
private final Map<Level, Appender> appenders = new HashMap<>();
public boolean isLoggable(Level level) {
return appenders.containsKey(level);
}
public void log(Level level, String message) {
Appender appender = appenders.get(level);
if (appender != null) {
appender.append(level, message);
}
}
public void addAppender(Appender appender) {
appenders.put(appender.getLevel(), appender);
}
}
private interface Appender {
Level getLevel();
void append(Level level, String message) throws IOException;
}
private static class ConsoleAppender implements Appender {
private final Level level;
public ConsoleAppender(Level level) {
this.level = level;
}
public Level getLevel() {
return level;
}
public void append(Level level, String message) throws IOException {
if (level.equals(this.level)) {
System.out.println("[" + level + "] " + message);
}
}
}
private static class FileAppender implements Appender {
private final Level level;
private final File logFile;
private final int maxFileSize;
private final int maxFiles;
public FileAppender(Level level, String logFileName, int maxFileSize, int maxFiles) {
this.level = level;
this.logFile = new File(logFileName);
this.maxFileSize = maxFileSize;
this.maxFiles = maxFiles;
}
public Level getLevel() {
return level;
}
public void append(Level level, String message) throws IOException {
if (level.equals(this.level)) {
if (logFile.exists() && logFile.length() >= maxFileSize) {
logFile.renameTo(new File(logFile.getPath() + ".old"));
for (int i = maxFiles; i > 0; i--) {
File oldFile = new File(logFile.getPath() + "." + i);
File newFile = new File(logFile.getPath() + "." + (i + 1));
if (oldFile.exists() && oldFile.length() >= maxFileSize) {
oldFile.renameTo(newFile);
} else {
break;
}
}
logFile.createNewFile();
}
if (!logFile.exists()) {
logFile.createNewFile();
}
System.out.println("Logging to file: " + logFile.getAbsolutePath());
// Write to the file
// ...
}
}
}
public static void main(String[] args) {
// Configure the logger
EnhancedLogging.log(Level.DEBUG, "This is a debug message.");
EnhancedLogging.log(Level.INFO, "This is an info message.");
EnhancedLogging.log(Level.WARN, "This is a warning message.");
EnhancedLogging.log(Level.ERROR, "This is an error message.");
}
}
在这个扩展的框架中,我们添加了一个FileAppender
类,它实现了日志轮转功能。FileAppender
类负责将日志写入。