java - 为什么 Slf4j+Log4j2 中的 MarkerPatternSelector 配置不起作用?

标签 java logging slf4j log4j2

当从代码中的特定位置记录时,我试图限制异常堆栈跟踪深度。正在关注http://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Selectors我的配置如下(关键部分):

<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).

上面的代码有什么问题导致标记不匹配?

最佳答案

我同意你的分析,也没有发现配置有任何问题。 (感谢您显示状态日志片段。)

您可能发现了一个错误。请在 Log4j2 JIRA 问题跟踪器上提出此问题。请提及您正在使用的 Log4j2 版本。 (如果您还没有尝试过最新版本,请先尝试一下。)

关于java - 为什么 Slf4j+Log4j2 中的 MarkerPatternSelector 配置不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42129210/

相关文章:

java - 使用 AJP 连接器和 mod_proxy 在 Tomcat 前面的 Apache 出错

python - 重新定义日志记录根记录器

java - 可分发库中的SLF4J,如何获取Logger

java - 使用 logback 和 nohup 在 Debian 后台运行 java 应用程序

java - vertx LoggerHandler 不添加 logback

java - 第一次使用 boolean c++ 或 java

java - 收到错误 - 打开套接字时出错 : java.net.SocketException:我的应用程序中打开的文件太多

java - 为什么 AES 解密给出空结果?

c++ - c++多线程应用程序上的内存损坏

iphone - 崩溃登录设备