全站最硬核 百万字强肝RocketMq源码 火热更新中~(一)

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值