我正在使用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中的一个错误,尽管模式中没有,但堆栈跟踪仍会进入输出。我一直在浏览文档,但我似乎无法找到一种方法来获得我想要的东西:只在专用的堆栈跟踪日志中打印堆栈跟踪。可以吗?
答案 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映射到过滤堆栈中。