1

我在 slf4j-api 1.7.7 上使用 logback 1.1.3。

我在这里阅读以下文档。

我试图限制日志记录并以下列方式引发异常的代码(我无法修改)。

try {.. }
catch( Exception e ) {
  log.error( "Houston we have a problem", e );
  throw new TestException( "Houston we have a problem", e );
}

我使用的日志格式如下。

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
        </Pattern>
    </layout>
</appender>

而且我希望一些记录器将其堆栈跟踪的显示限制为 2 行,所以我想我可以简单地将其修改为文档中规定的以下格式。

<appender name="STDOUT_COMPACT" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>
            %ex{2} %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
        </Pattern>
    </layout>
</appender>

我期待得到类似以下的东西。

mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)

但相反,我得到了以下内容。

mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
mainPackage.foo.bar.TestException: Houston we have a problem
  at mainPackage.foo.bar.TestThrower.fire(TestThrower.java:22)
  at mainPackage.foo.bar.TestThrower.fire1(TestThrower.java:12)
  at mainPackage.foo.bar.TestThrower.fire2(TestThrower.java:44)
  at mainPackage.foo.bar.TestThrower.fire3(TestThrower.java:122)
  at mainPackage.foo.bar.TestThrower.fire4(TestThrower.java:322)
  at mainPackage.foo.bar.TestThrower.fire5(TestThrower.java:72)
  ..

日志被简单地重复,而不是被截断为 2 行。我究竟做错了什么?我该如何正确使用该ex{n}格式?我不喜欢为此编写自定义记录器。

4

1 回答 1

4

您必须在模式中包含 %nopex。否则,即使您已经打印了堆栈跟踪,Logback 也会添加堆栈跟踪。您的模式应如下所示:

%ex{2} %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%nopex%n

在末尾包含这样的异常更为常见:

%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg %ex{2}%nopex%n
于 2019-02-07T21:23:02.753 回答