Slf4j / logback - 在单独的文件

时间:2016-08-05 22:58:10

标签: java

我正在使用logback支持slf4j设置项目。我使用

在我的程序的根目录中记录异常
logger.error(ex.getMessage(), ex);

我已经像这样配置了logback(减去不重要的东西)

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>app.log</file>
    <encoder>
        <pattern>${details}: %msg%n</pattern>
    </encoder>
</appender>

<root>
    <appender-ref ref="FILE"/>
</root>

重要部分工作正常。我的问题是,尽管%ex未包含在我的模式中,但仍然会在错误消息之后将stacktraces打印为常规类似于sysout的行。

00:23:50.713 ERROR blabla: something happened java.lang.RuntimeException: something happened at ... at ...

由于我希望我的日志可以轻松解析,因此堆栈跟踪符合我的方式(它不符合我的行格式),我不想在那里。我希望stacktraces转到一个单独的文件,打印为

<file>stacktrace.log</file>
<encoder>
    <pattern>${details}: %ex%n</pattern>
</encoder>

我假设这个显而易见的事情并不是logback中的一个错误,尽管模式中没有,但堆栈跟踪仍会进入输出。我一直在浏览文档,但我似乎无法找到一种方法来获得我想要的东西:只在专用的堆栈跟踪日志中打印堆栈跟踪。可以吗?

2 个答案:

答案 0 :(得分:1)

我刚在文档中找到了this important nuance

If you do not specify %xThrowable or another throwable-related conversion word in the conversion pattern, PatternLayout will automatically add it as the last conversion word, on account of the importance of stack trace information. The $nopex conversion word can be substituted for %xThrowable, if you do not wish stack trace information to be displayed. See also the %nopex conversion word.

考虑到这一点,它只是简单地过滤异常等等。

答案 1 :(得分:0)

一个有效的解决方法是在我的所有异常日志中添加一个名为STACKTRACE的标记,然后在我的配置中过滤该标记,但这只是一种解决方法。

或者将错误级别的消息过滤到单独的日志中,但感觉它没有将1:1映射到过滤堆栈中。