1.工作中遇到问题
工作发现之前的代码异常日志有问题,没有把异常的信息打印出来。打印日志的代码:
//输出异常名称
logger.info(ex.getMessage());
//输出堆栈信息
logger.error("system error resolve Exception", ex);
查看日志的时候,发现分别输出""和system error resolve Exception。异常名称和堆栈信息都没有输出来。
2.SLF4J输出规范
(1)非异常日志输出
trace/debug/info级别的日志输出,必须使用条件输出形式或者使用占位符{}的方式
。占位符是一个非常类似于在String的format()方法中的%s,因为它会在运行时被某个提供的实际字符串所替换。这不仅降低了你代码中字符串连接次数,而且还节省了新建的String对象。
- 正确的用法:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
- 错误的用法
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol)
如果日志级别是warn或info,上述日志不会打印,但是会执行字符串拼接操作
,如果symbol是对象,会执行toString()方法
,浪费了系统资源,执行了上述操作,最终日志却没有打印。 使用条件输出形式也可以解决这种问题:
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " and symbol: " + symbol);
}
(2)异常日志输出
对于异常,是不需要占位符的,而且也不需要e.getMessage(),直接打印出来即可。使用log.error方法输出
//打印出异常名称和印堆栈信息
log.error("测试 ",e);
//只会打印出异常名称,不会打印堆栈信息
log.error("测试:" +e);
3.SLF4J详解用法
下面具体介绍日志输出常见的一些代码。
@Test
public void testExcept(){
File file = new File("E:\\study\\text.txt");
FileReader fr = null;
try{
fr= new FileReader(file);
}catch (FileNotFoundException e) {
log.error("测试 : ",e.getMessage());
log.error("测试 :"+e.getMessage());
log.error("测试 :"+e);
log.error("测试 : ",e);
e.printStackTrace();
}
}
经过代码分析,ex.getMessage()的值不空(E:\study\text.txt (系统找不到指定的路径))。按照上面顺序解释:
(1)不会打印任何异常信息(容易犯的错误)。
(2)只打印异常名称的一部分:异常的详细消息字符串。
(3)只会打印出异常名称。
(4)打印出异常名称和印堆栈信息
因此:e.getMessage() 基本用不上。
网友评论