12

我正在为 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();
}

有更好/更认可的方式吗?

4

2 回答 2

7

ThrowableProxyConverter 是打印堆栈跟踪的方法。因此,您打算使用的代码看起来不错。但是,您可以使用自定义转换器来调整 PatternLayout,而不是编写 CustomLayout 。在绝大多数情况下,这是更容易/更好的选择。

于 2013-06-04T06:45:34.170 回答
5

这可能会帮助您:

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);
}
于 2018-12-06T06:52:51.243 回答