转载请标明出处:
原文首发于: http://www.zhangruibin.com
本文出自 RebornChang的博客
Slf4j 一点小技能
说起来Web开发,分为很多模块,日志模块是其中不可或缺的一部分。日志的收集统计分析这里不讲这些,只是说一点在开发中常用的小技能点。
首先问看官两个问题:
打印日志的时候,‘{}’的作用是什么?
打印日志的时候,‘+’和‘,’的区别是什么?
打印日志的时候,对catch到的异常信息的打印中‘logger.error(“错误信息:”+e.getMessage())’和‘logger.error(“错误信息:”+e)’的区别是什么?
至于日志的7级设置以及含义配置什么的这就不说啦,博主这节说的是骗冷的小知识,下面开说。
首先说下‘{}’的作用:
logger.info()中的‘{}’
在 logger.info() 中,‘{}’是占位符,Slf4j会根据占位符的位置,获取对应的Object的数据进行占位符填充。
先看Slf4j关于logger的info级别的源码部分:
void info(String var1, Object var2);
void info(String var1, Object var2, Object var3);
void info(String var1, Object... var2);
void info(String var1, Throwable var2);
void info(Marker var1, String var2);
void info(Marker var1, String var2, Object var3);
void info(Marker var1, String var2, Object var3, Object var4);
void info(Marker var1, String var2, Object... var3);
void info(Marker var1, String var2, Throwable var3);
从上面我们可以看出,info级别的方法,第一个参数是String类型的,第二个参数是object类型的(注意可变参数Object… var2),所以,直接写:
logger.info("这里只写一段字符串"+"或者再拼接上一串字符串,是没有问题的")
因为这时候走的是 void info(String var1, Object... var2);方法进行日志的输出打印。
如果我这是有一个Person对象,对象为zhangsan,我想把这个张三的信息打印出来,这时候我们可以这样做:
logger.info("这就是zhangsan的信息:{}",zhangsan.toString());
注意:如果我还想在这一句中打印出来zhangsan的名字,那应该怎么写?
logger.info("这就是zhangsan的信息:{};zhangsan的名字是:{}。",zhangsan.toString(),zhangsan.getName.toString());
这时候就理解了吧,在info级别中‘{}’的是占位符,因为info的方法里面都有String类型参数,所以占位符’{}'才能生效。
接下来说‘+’和‘,’的区别是什么
依据上图Slf4j中给出的方法我们也能猜到了,‘+’就是对Sting类型的那个参数进行拼接,‘,’是对另一个参数进行声明和传参,那有的人说了,反正我是要打印到日志里面,我都用toSting()然后用‘+’拼接不就行了?
这里就涉及到了‘{}’这个占位符的作用。因为这个占位符是将除了第一个string类型的参数填充到‘{}’的位置,所以全使用toString()然后使用‘+’进行拼接的话‘{}’是不起作用的。
对catch到的异常信息的打印中‘logger.error(“错误信息:”+e.getMessage())’和‘logger.error(“错误信息:”+e)’的区别是什么
咱们首先看下java.lang.Throwable里面对getMassage的使用及解释:
```
/**
* Returns the detail message string of this throwable.
*
* @return the detail message string of this {@code Throwable} instance
* (which may be {@code null}).
*/
public String getMessage() {
return detailMessage;
}
/**
* Specific details about the Throwable. For example, for
* {@code FileNotFoundException}, this contains the name of
* the file that could not be found.
*
* @serial
*/
private String detailMessage;
```
举一个例子,常见的空指针异常:
e.getMessage(),是告诉你说是空指针,不会打印堆栈信息,所以在使用logger.error()进行日志打印的时候我们可以这样:
logger.error("异常:",e.getMessage(),e);
说的比较浅显,都是小细节,想深究的同学可以自行深究,欢迎交流讨论指正。