如何从logback自定义布局中打印堆栈跟踪?

14

我正在为logback编写一个CustomLayout,因为我想调整线程名称和日志记录器名称。 logback文档说:

在上面的示例中,doLayout方法忽略事件中包含的任何异常。在真实的布局实现中,您很可能也希望打印异常内容。

嗯,当默认实现会时,我当然希望打印堆栈跟踪信息。但是我找不到如何执行此操作的说明。我下载了源代码并查看了一下。以下代码似乎有效:

/**
 * How much stack to print if there's an exception.
 */
private List<String> stackOptionList = Arrays.asList("full");

@Override
public String doLayout(ILoggingEvent event) {
  StringBuffer sbuf = new StringBuffer(128);
  . . .
  IThrowableProxy proxy = event.getThrowableProxy();
  if (proxy != null) {      
    ThrowableProxyConverter converter = new ThrowableProxyConverter();
    converter.setOptionList(stackOptionList);
    converter.start();
    sbuf.append(converter.convert(event));
    sbuf.append(CoreConstants.LINE_SEPARATOR);
  }
  . . .
  return sbuf.toString();
}

有没有更好/更可靠的方式?


我花了很长时间来寻找这个答案并验证我的做法。我一开始采用了与你完全相同的方法,但正如@Ceki所提到的那样,我转而采用了自定义转换器的方法,因为它更容易、更清晰。 - 1Mojojojo1
2个回答

8
这可能对您有所帮助:

ch.qos.logback.classic.spi.ThrowableProxyUtil

StringBuffer sbuf = new StringBuffer();
....
IThrowableProxy throwbleProxy =  event.getThrowableProxy();
if (throwbleProxy != null) {
    String throwableStr = ThrowableProxyUtil.asString(throwbleProxy);
    sbuf.append(throwableStr);
    sbuf.append(CoreConstants.LINE_SEPARATOR);
}

7

ThrowableProxyConverter是打印堆栈跟踪的理想方式。因此,你打算使用的代码看起来不错。但是,你可以通过自定义转换器来改变PatternLayout,而无需编写CustomLayout。在绝大多数情况下,这是更简单/更好的选择。


@ceki 每次执行 doLayout 是否应该创建、启动和停止一个新的 ThrowableProxyConverter - Ittai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接