1
我想从代码中的特定位置登录时限制异常堆栈跟踪深度。继http://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Selectors我的配置是这样的(关键部分):为什么在Slf4j + Log4j2中这个MarkerPatternSelector配置不起作用?
<PatternLayout>
<MarkerPatternSelector defaultPattern="%d{dd MMM yyyy HH:mm:ss,SSS}: %m%n">
<PatternMatch key="ExceptionInterceptor"
pattern="%d{dd MMM yyyy HH:mm:ss,SSS}: %m%throwable{5}%n" />
</MarkerPatternSelector>
</PatternLayout>
在Java代码:
@Slf4j
public final class ExceptionInterceptor {
private static final Marker MARKER = MarkerFactory.getMarker("ExceptionInterceptor");
public void intercept(Throwable t) {
log.info(MARKER, "Got exception", t);
}
然而出于某种原因标记似乎并不匹配,即我得到充分堆栈记录。当我将%throwable{5}
添加到defaultPattern
属性时,堆栈将按预期截断。
这是启动期间的相关DEBUG日志(剥离时间戳&级别)。如果我正确地阅读它,似乎构建匹配器好。
Building Plugin[name=PatternMatch, class=org.apache.logging.log4j.core.layout.PatternMatch]. Searching for builder factory method...
Found builder factory method [newBuilder]: public static org.apache.logging.log4j.core.layout.PatternMatch$Builder org.apache.logging.log4j.core.layout.PatternMatch.newBuilder().
Calling build() on class class org.apache.logging.log4j.core.layout.PatternMatch$Builder for element PatternMatch with params(, key="ExceptionInterceptor", pattern="%d{dd MMM yyyy HH:mm:ss,SSS}: %m%throwable{5}%n")
Built Plugin[name=PatternMatch] OK from builder factory method.
Building Plugin[name=patternSelector, class=org.apache.logging.log4j.core.layout.MarkerPatternSelector]. Searching for builder factory method...
No builder factory method found in class org.apache.logging.log4j.core.layout.MarkerPatternSelector. Going to try finding a factory method instead.
Still building Plugin[name=patternSelector, class=org.apache.logging.log4j.core.layout.MarkerPatternSelector]. Searching for factory method...
Found factory method [createSelector]: public static org.apache.logging.log4j.core.layout.MarkerPatternSelector org.apache.logging.
log4j.core.layout.MarkerPatternSelector.createSelector(org.apache.logging.log4j.core.layout.PatternMatch[],java.lang.String,boolean,boolean,org.apache.logging.log4j.core.config.Configuration).
上面的代码有什么问题导致标记不匹配?
你说得对。我使用的是Log4j 2.4,升级到2.6后问题就消失了。谢谢! – alexandroid
你可能想升级到2.8,因为许多错误已经被修复,因为2.6 ... :-) –