lombok.extern.slf4j @Slf4j topic的使用

在logback.xml 的配置文件中,我们通常会配置几个Logger
1.默认的root logger

<root level="WARN">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="RF" />
    </root> 

这里就不讲解说明appender 的使用了,可以自行了解。

2.配置以包名命名的logger

<logger name="com.demo" level="TRACE"/>

这个logger没有指定appender,additivity默认为true,它会默认使用root节点中定义的那些appender 进行日志打印输出。level 会覆盖root 的lever

<logger name="com.demo" level="TRACE"  additivity="false">	
 		<appender-ref ref="CMDCONSUMERRF" />
    	<appender-ref ref="STDOUT" />
</logger>

如果logger 定义了自己appender ,未设置additivity,则日志会重复打印输出。故需要设置additivity=“false”。

3.自定义logger name 标签

<logger name="customLogger" level="TRACE"  additivity="false">
    	 <appender-ref ref="CustomLogger" />
    	 <appender-ref ref="STDOUT" />
    </logger>

此类logger 和上面以包名 命令的logger 其实是一样的。以包名 命令的logger 通常用于这个包或者这个路径下的所有类整个日志输出appender的一个定义。自定义logger name的logger,可以单独定义一个类的日志打印输出。自定义的logger通过设置自己的appender和additivity=“false”,完成自定义的日志输出 ,如果不设置additivity="false"和appender ,会默认使用root 的节点的appender 进行日志打印输出。

topic 的使用

@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Slf4j {
	/**
	 * Sets the category of the constructed Logger. By default, it will use the type where the annotation is placed.
	 */
	String topic() default "";
}

@Slf4j 注解有个topic 属性可以进行设置要采用的logger,
topic 的值对应的就是logback.xml中定的logger name。root logger是默认就存在的。
1.创建logger
类ch.qos.logback.classic.LoggerContext.class
根据logback.xml 配置文件中配置logger name和topic 定义的name 创建logger,按照分隔符进行分割循环创建对应的logger。

public final Logger getLogger(final String name) {

        if (name == null) {
            throw new IllegalArgumentException("name argument cannot be null");
        }

        // if we are asking for the root logger, then let us return it without
        // wasting time
        if (Logger.ROOT_LOGGER_NAME.equalsIgnoreCase(name)) {
            return root;
        }

        int i = 0;
        Logger logger = root;

        // check if the desired logger exists, if it does, return it
        // without further ado.
        Logger childLogger = (Logger) loggerCache.get(name);
        // if we have the child, then let us return it without wasting time
        if (childLogger != null) {
            return childLogger;
        }

        // if the desired logger does not exist, them create all the loggers
        // in between as well (if they don't already exist)
        String childName;
        while (true) {
            int h = LoggerNameUtil.getSeparatorIndexOf(name, i);
            if (h == -1) {
                childName = name;
            } else {
                childName = name.substring(0, h);
            }
            // move i left of the last point
            i = h + 1;
            synchronized (logger) {
                childLogger = logger.getChildByName(childName);
                if (childLogger == null) {
                    childLogger = logger.createChildByName(childName);
                    loggerCache.put(childName, childLogger);
                    incSize();
                }
            }
            logger = childLogger;
            if (h == -1) {
                return childLogger;
            }
        }
    }

分隔符分割

public static int getSeparatorIndexOf(String name, int fromIndex) {
        int dotIndex = name.indexOf(CoreConstants.DOT, fromIndex);
        int dollarIndex = name.indexOf(CoreConstants.DOLLAR, fromIndex);

        if (dotIndex == -1 && dollarIndex == -1)
            return -1;
        if (dotIndex == -1)
            return dollarIndex;
        if (dollarIndex == -1)
            return dotIndex;

        return dotIndex < dollarIndex ? dotIndex : dollarIndex;
    }

1.当topic 没有设置时,topic 默认值为当前注解所在类的全路径。在创建logger 时会根据这个全路径循环分割创建各层级的子logger,最后依据子logger 不存在appender,依据父logger 的appender 进行日志打印输出。如果没有找到,则不会进行日志打印。

2.当设置topic时。

@Slf4j(topic="customLogger")

创建该name 的logger,如果该logger 在logback.xml 不存在定义配置,则不会进行日志打印。

root logger 不是作为所有logger 的父looger 存在,只是全局的日志级别和appender 的一个默认配置。

  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值