引入:
小菜鸟因为总是用sout输出调试信息被组长批评,于是写下了这样一行代码:
log.info("我"+UserUtils.getName()+"不是小菜鸟!",);
小菜鸟心想,也没什么了不起嘛!sout换了个名字输出而已!
于是心满意足的小菜鸟开始浏览其他同事的日志:
log.info("限制请求'{}',当前请求'{}',缓存key'{}'", count, number.intValue(), combineKey);
小菜鸟 感到很好奇,好像同事的输出更加规范,也不用想在哪使用 "+" 拼接了,很不错嘛!
于是他开始思考起了如何实现这个功能。。。。。。
==> ==> ==> ==> ==> ==> ==>0% ==> 99% ==> 99% ==> 99%
实现:
一天过去了,小菜鸟实现了99%,还有一窍未通
为了怕组长发现他摸鱼 于是他决定看一下源码是怎么实现的!
MessageFormatter
public static final FormattingTuple arrayFormat(String messagePattern, Object[] argArray) {
Throwable throwableCandidate = getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
args = trimmedCopy(argArray);
}
return arrayFormat(messagePattern, args, throwableCandidate);
}
SL4J依赖于内部的MessageFormatter来实现,通过接收参数列表的形式,最后一个参数可以使Excepition
处理最后一个参数:
public static Throwable getThrowableCandidate(Object[] argArray) {
if (argArray != null && argArray.length != 0) {
Object lastEntry = argArray[argArray.length - 1];
return lastEntry instanceof Throwable ? (Throwable)lastEntry : null;
} else {
return null;
}
}
处理参数数据和模板消息为空的情况:
if (messagePattern == null) {
return new FormattingTuple((String)null, argArray, throwable);
} else if (argArray == null) {
return new FormattingTuple(messagePattern);
}
根据参数数组argArray遍历追加内容到模板messagePattern,每找到一个"{}" 就把检查开始的位置 i 向后移动
for(int L = 0; L < argArray.length; ++L) {
int j = messagePattern.indexOf("{}", i);
if (j == -1) {
if (i == 0) {
return new FormattingTuple(messagePattern, argArray, throwable);
}
sbuf.append(messagePattern, i, messagePattern.length());
return new FormattingTuple(sbuf.toString(), argArray, throwable);
}
处理字符串转义的情况;
if (isEscapedDelimeter(messagePattern, j)) {
if (!isDoubleEscaped(messagePattern, j)) {
--L;
sbuf.append(messagePattern, i, j - 1);
sbuf.append('{');
i = j + 1;
} else {
sbuf.append(messagePattern, i, j - 1);
deeplyAppendParameter(sbuf, argArray[L], new HashMap());
i = j + 2;
}
} else {
sbuf.append(messagePattern, i, j);
deeplyAppendParameter(sbuf, argArray[L], new HashMap());
i = j + 2;
}
}
结局:
看了看源码的实现,小菜鸟觉得和自己平常写业务也差不太多,感觉自己又学到了
看了看时间,六点半,完美!一套连招,小菜鸟愉快下班!