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

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

  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));

  }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/dianzi/2717499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存