log.info(“Hello, {}! Today is {}.“, “World“, “Wednesday“)是怎么实现?

引入:

小菜鸟因为总是用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; } }

结局:

看了看源码的实现,小菜鸟觉得和自己平常写业务也差不太多,感觉自己又学到了

看了看时间,六点半,完美!一套连招,小菜鸟愉快下班!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值