为防止被序列化,加了transient关键字,内部定义了六种日志级别:
final static public Level OFF = new Level(OFF_INT, OFF_NAME, 0);
final static public Level ERROR = new Level(ERROR_INT, ERROR_NAME, 3);
final static public Level WARN = new Level(WARN_INT, WARN_NAME, 4);
final static public Level INFO = new Level(INFO_INT, INFO_NAME, 6);
final static public Level DEBUG = new Level(DEBUG_INT, DEBUG_NAME, 7);
final static public Level ALL = new Level(ALL_INT, ALL_NAME, 7);
值得注意的是这个toLevel方法:
public static Level toLevel(String sArg, Level defaultLevel) {
if (sArg == null) {
return defaultLevel;
}
String s = sArg.toUpperCase();
if (s.equals(ALL_NAME)) {
return Level.ALL;
}
if (s.equals(DEBUG_NAME)) {
return Level.DEBUG;
}
if (s.equals(INFO_NAME)) {
return Level.INFO;
}
if (s.equals(WARN_NAME)) {
return Level.WARN;
}
if (s.equals(ERROR_NAME)) {
return Level.ERROR;
}
if (s.equals(OFF_NAME)) {
return Level.OFF;
}
if (s.equals(INFO_NAME)) {
return Level.INFO;
}
return defaultLevel;
}
String s = sArg.toUpperCase(); 这个就很用户友好了,也就是说获取日志级别,用户输入大小写都是兼容的。
此时我们再次回到DefaultLoggerRepository,此时我们就明白了,DefaultLoggerRepository其实就是Logger内部用来做缓存的内部类,底层由Hashtable实现,并对Hashtable使用synchronized关键字做了并发处理。
回到Logger,继续往下走,又看到
Appender.AppenderPipelineImpl appenderPipeline;
org.apache.rocketmq.logging.inner.Appender.AppenderPipelineImpl
从翻译看,这个叫追加器管道,是AppenderPipeline的实现类,下面是这个接口的定义:
public interface AppenderPipeline {
void addAppender(Appender newAppender);
Enumeration getAllAppenders();
Appender getAppender(String name);
boolean isAttached(Appender appender);
void removeAllAppenders();
void removeAppender(Appender appender);
void removeAppender(String name);
}
进入实现类AppenderPipelineImpl可以看到,其实这个管道,就是一个元素类型为Appender的Vector集合
public static class AppenderPipelineImpl implements AppenderPipeline {
protected Vector<Appender> appenderList;
附:Vector,与ArrayList、LinkedList相比,特点在于线程安全。多线程环境推荐使用。