文章目录
namesrv
org.apache.rocketmq.namesrv.kvconfig.KVConfigManager
从头开始的第一个类
org.apache.rocketmq.logging.InternalLoggerFactory
代码入口首先是日志工具org.apache.rocketmq.logging.InternalLoggerFactory
InternalLoggerFactory是一个抽象类,有两个实现类:InnerLoggerFactory和Slf4jLoggerFactory
内部有两个重要内容,一个是InternalLoggerFactory,另一个是InternalLogger
还有一个ConcurrentHashMap类型的缓存:loggerFactoryCache key是唯一标识,value是InternalLoggerFactory,也就是这个类本身。
LoggerFactory的获取,优先返回用户设置的loggerType,其次是默认的(slf4j),最后是(inner),如果全部初始化失败则抛出异常。
注意一个细节:InternalLoggerFactory的构造方法非常简洁,抽取成了一个私有方法:
protected void doRegister() {
String loggerType = getLoggerType();
if (loggerFactoryCache.get(loggerType) != null) {
return;
}
loggerFactoryCache.put(loggerType, this);
}
// 方法的作用就是把当前日志工厂塞入缓存
抽象方法:
protected abstract String getLoggerType();
作用就是返回当前日志工厂的类型(slf4j或者inner)
一个比较重要的方法是:
protected abstract InternalLogger getLoggerInstance(String name);
获取打印日志的实例InternalLogger
因为实际打印日志时,使用的就是InternalLogger实例。下面去看一下getLoggerInstance(String name)的一个实现类:slf4j中的实现
Slf4jLoggerFactory中的getLoggerInstance所获取的InternalLogger,其实就是对org.slf4j.LoggerFactory的一个封装
public Slf4jLogger(String name) {
logger = LoggerFactory.getLogger(name);
}
可以看到,没有做任何处理。
再看下getLoggerInstance(String name)的一个实现类:InnerLoggerFactory中的实现
同样是看从哪里获取的InnerLogger
public InnerLogger(String name) {
logger = Logger.getLogger(name);
}
org.apache.rocketmq.logging.inner.Logger
这里的Logger的全名是:org.apache.rocketmq.logging.inner.Logger 也就是说这是rocketmq自己开发的Logger
org.apache.rocketmq.logging.inner.Logger.DefaultLoggerRepository
进来之后首先声明一个DefaultLoggerRepository
private static final DefaultLoggerRepository REPOSITORY = new DefaultLoggerRepository(new RootLogger(Level.DEBUG));
DefaultLoggerRepository是Logger的内部类,底层主要是由HashTable实现
final Hashtable<CategoryKey,Object> ht = new Hashtable<CategoryKey,Object>();
key为CategoryKey(String类型的name + name的hashcode),value为Object
org.apache.rocketmq.logging.inner.Level
内部有一个对日志等级的定义:org.apache.rocketmq.logging.inner.Level
对外暴露三个属性:level,levelStr,syslogEquivalent
transient int level;
transient String levelStr;
transient int syslogEquivalent;