logback异常输出详细信息(调用堆栈)分析

嵌入式设计应用

132人已加入

描述

  Logback背景

  Logback是一个开源的日志组件,是log4j的作者开发的用来替代log4j的。

  logback由三个部分组成,logback-core, logback-classic, logback-access。其中logback-core是其他两个模块的基础。

  slf4j 定义日志接口及基本实现,而具体的实现由其他日志组件提供

  log4j

  commons-logging

  logback

  因此,如果想替换成其他的日志组件,只需要替换jar包即可。

  logback中三个重要概念: Logger,Appender,Layout

  Logger: 日志记录器,把它关联到应用对应的context上后,主要用于存放日志对象,定义日志类型,级别。

  Appender: 指定日志输出的目的地,目的地可以是控制台,文件,或者数据库等

  Layout: 负责把事件转换成字符串,格式化日志信息的输出

  寻找logback.xml

  logback首先在classpath寻找logback.groovy文件,

  如果没找到,继续寻找logback-test.xml文件

  如果没找到,继续寻找logback.xml文件

  如果仍然没找到,则使用默认配置(打印到控制台)

     logback异常输出详细信息(调用堆栈)

  可能使用logback或者log4j的大家都遇到过这种情况,想要在try catch中输出异常到日志的时候使用了logger.error(e.getMessage());但是这样输出后只有一行简单的异常提示,并没有详细的调用堆栈的信息,所以我们需要定义一个工具类来获取异常详细的调用堆栈。

  [java] view plain copyimport java.io.IOException;

  import java.io.PrintWriter;

  import java.io.StringWriter;

  public class ExceptionUtil {

  public static String getMessage(Exception e) {

  StringWriter sw = null;

  PrintWriter pw = null;

  try {

  sw = new StringWriter();

  pw = new PrintWriter(sw);

  // 将出错的栈信息输出到printWriter中

  e.printStackTrace(pw);

  pw.flush();

  sw.flush();

  } finally {

  if (sw != null) {

  try {

  sw.close();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  if (pw != null) {

  pw.close();

  }

  }

  return sw.toString();

  }

  }

  传入一个异常写入流中再转为字符串输出出来就是我们想要的详细信息(调用堆栈)

  使用logback、log2j输出java异常如果采用如下方式:

  [java] view plain copytry{

  。。.

  }catch (Exception e){

  logger.error(“[lid:{}] [{}]《《 exception happened! detail:{}”, logIndex, logFlag, e);

  }

  则无法输出异常的调用堆栈,下面这个一个静态工具函数,可以输出异常的堆栈信息,如下:

  [java] view plain copypublic static String getExceptionStackTrace(Throwable anexcepObj)

  {

  StringWriter sw = null;

  PrintWriter printWriter = null;

  try{

  if(anexcepObj != null)

  {

  sw = new StringWriter();

  printWriter = new PrintWriter(sw);

  anexcepObj.printStackTrace(printWriter);

  printWriter.flush();

  sw.flush();

  return sw.toString();

  }

  else

  return null;

  }finally

  {

  try

  {

  if(sw != null)

  sw.close();

  if(printWriter != null)

  printWriter.close();

  }

  catch (IOException e)

  {

  e.printStackTrace();

  }

  }

  }

  它的使用方式为:

  [java] view plain copytry{

  。。.

  }catch (Exception e){

  logger.error(“[lid:{}] [{}]《《 exception happened! detail:{}”, logIndex, logFlag, 《span style=“color:#ff0000;”》getExceptionStackTrace《/span》(e));

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分