lombok.extern.slf4j @Slf4j topic的使用
在logback.xml 的配置文件中,我们通常会配置几个Logger1.默认的root logger<root level="WARN"><appender-ref ref="STDOUT" /><appender-ref ref="RF" /></root>这里就不讲解说明appender ...
在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 的一个默认配置。
更多推荐
所有评论(0)