Фильтрация кадров промежуточного программного обеспечения из журналов трассировки стека в JBoss 7 с помощью Filter-spec - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу уменьшить продолжительность регистрации исключений в JBoss 7, теряя при этом как можно меньше ценной информации.Я пытаюсь отфильтровать все фреймы стека промежуточного программного обеспечения JBoss, которые обычно дают небольшое представление о реальных проблемах в коде приложения.Пример фрейма, который я пытаюсь отфильтровать: "at sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод)" или "at org.jboss.invocation.InterceptorContext.proceed (InterceptorContext.java:288)".

Я смог отфильтровать обычные записи журнала полностью, используя filter-spec в конфигурации регистрации в файле конфигурации JBoss:

<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 value="substituteAll(&quot;sun.reflect.NativeMethodAccessorImpl&quot;, &quot;&quot;)" />

Но этот фильтр, похоже, игнорирует трассировки стека.

Может кто-нибудь предложить способ фильтрации этих трасс стека в среде JBoss?

1 Ответ

0 голосов
/ 16 февраля 2019

К сожалению, фильтры не работают с исключениями.Также в настоящее время нет возможности использовать пользовательские фильтры.Однако вы можете использовать custom-formatter или custom-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это для обработчика консоли будет выглядеть примерно так:

/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 или делать что-то странное, например makesetDelegate() добавляет обработчик в какую-либо коллекцию.

Обновление

Я просто хочу отметить, что теперь есть открытая JIRA для учета пользовательских фильтров.

...