使用Filter-spec从JBoss 7中的堆栈跟踪日志过滤中间件帧

问题描述 投票:0回答:1

我希望减少异常登录JBoss 7的长度,同时尽可能少地丢失有价值的信息。我要做的是过滤掉任何JBoss中间件堆栈帧,这些帧通常可以提供对应用程序代码中实际问题的深入了解。我试图过滤的框架示例:“at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)”或“at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)”。

我已经能够使用JBoss配置文件中的日志记录配置中的filter-spec完全过滤掉常规日志条目:

<console-handler name="CONSOLE">
    <level name="TRACE" />
    <formatter>
    <pattern-formatter
            pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n" />
</formatter>
    <filter-spec value="not(match(&quot;Validation&quot;))" />
</console-handler>

我还能够替换与特定过滤器表达式匹配的日志条目:

<console-handler name="CONSOLE">
    <level name="TRACE" />
    <formatter>
    <pattern-formatter
            pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n" />
</formatter>
    <filter-spec value="substituteAll(&quot;Validation&quot;, &quot;Im here!!!!&quot;)" />
    <filter-spec value="not(match(&quot;Validation&quot;))" />
</console-handler>

但是当我尝试替换异常堆栈跟踪框架而不是常规日志条目时,它不起作用。我试图使用的filter-spec是:

<filter-spec value="substituteAll(&quot;sun.reflect.NativeMethodAccessorImpl&quot;, &quot;&quot;)" />

但是这个过滤器似乎忽略了堆栈跟踪。

任何人都可以建议在JBoss环境中过滤这些堆栈跟踪的方法吗?

logging jboss jboss-eap-7
1个回答
0
投票

不幸的是,过滤器不适用于异常。目前也无法使用自定义过滤器。然而,您可以使用custom-formattercustom-handler,这可以为您做到这一点。

示例自定义处理程序可能如下所示:

public class TrimCauseHandler extends Handler {

    private Handler delegate;

    @Override
    public synchronized void publish(final LogRecord record) {
        if (delegate != null) {
            final Throwable cause = record.getThrown();
            if (cause != null) {
                final Collection<StackTraceElement> st = new ArrayList<>();
                for (StackTraceElement e : cause.getStackTrace()) {
                    final String className = e.getClassName();
                    if (className.startsWith("org.jboss.as") || className.startsWith("org.wildfly")) {
                        continue;
                    }
                    st.add(e);
                }
                cause.setStackTrace(st.toArray(new StackTraceElement[0]));
            }
            record.setThrown(cause);
            delegate.publish(record);
        }
    }

    @Override
    public synchronized void flush() {
        if (delegate != null) {
            delegate.flush();
        }
    }

    @Override
    public synchronized void close() throws SecurityException {
        if (delegate != null) {
            delegate.close();
        }
    }

    public synchronized Handler getDelegate() {
        return delegate;
    }

    public synchronized void setDelegate(final Handler delegate) {
        this.delegate = delegate;
    }
}

然后,将CLI用于控制台处理程序的CLI命令将类似于:

/subsystem=logging/custom-handler=test:add(module=your.module, class=org.jboss.example.handlers.TrimCauseHandler, properties={delegate="CONSOLE"})
/subsystem=logging/root-logger=ROOT:remove-handler(name=CONSOLE)
/subsystem=logging/root-logger=ROOT:add-handler(name=test)

它看起来不像数组是支持的属性类型所以你必须将每个处理程序包装在TrimCauseHandler中或做一些奇怪的事情,比如make setDelegate()将处理程序添加到某种集合中。

更新

我只是想指出现在有一个开放的JIRA允许自定义过滤器。

© www.soinside.com 2019 - 2024. All rights reserved.