Slf4j 一点小技能

/ Java / 没有评论 / 80浏览
转载请标明出处:
原文首发于: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);

说的比较浅显,都是小细节,想深究的同学可以自行深究,欢迎交流讨论指正。