答案是否定的,这是不可能的。
你现在这样做的方式很好(当然,一旦同步)。
还有一个替代方案:不是扩展 Logger,而是扩展 java.util.logging.Handler,然后:
覆盖 publish() 方法
实现flush()和close()
创建一个按级别计算消息的方法
我尝试了这个并对其进行了测试,它确实有效:
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public class CountHandler extends Handler {
List<LogRecord> records = new ArrayList<LogRecord>();
@Override
public void publish(LogRecord record) {
records.add(record);
}
public int howMany(Level level) {
int howMany = 0;
for(LogRecord record : records) {
if (record.getLevel().intValue() == level.intValue()) {
howMany++;
}
}
return howMany;
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
}
这样做的好处是您不必为每个级别重写方法。唯一的事情是您必须将此处理程序添加到每个记录器:
CountHandler messageCounter= new CountHandler();
logger.addHandler(messageCounter);
所以,把它当作它的价值。无论你做什么,你都必须编写自己的类。