使用 Filter-spec 从 JBoss 7 中的堆栈跟踪日志中过滤中间件框架
Filtering Middleware Frames from Stack Trace Logs in JBoss 7 with Filter-spec
我想减少在 JBoss 7 上记录异常的长度,同时尽可能少地丢失有价值的信息。我想做的是过滤掉任何 JBoss 中间件堆栈帧,这些堆栈帧通常无法深入了解应用程序代码中的实际问题。
我尝试过滤的帧示例:"at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)" 或“在 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("Validation"))" />
</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("Validation", "Im here!!!!")" />
<filter-spec value="not(match("Validation"))" />
</console-handler>
但是,当我尝试用异常堆栈跟踪框架代替常规日志条目时,它不起作用。我尝试使用的过滤器规格是:
<filter-spec value="substituteAll("sun.reflect.NativeMethodAccessorImpl", "")" />
但是这个过滤器似乎忽略了堆栈跟踪。
任何人都可以建议一种在 JBoss 环境中过滤这些堆栈跟踪的方法吗?
不幸的是,过滤器对异常不起作用。目前也无法使用自定义过滤器。但是,您可以使用 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
中或做一些奇怪的事情,例如 make setDelegate()
添加处理程序到某种集合。
更新
我只想指出现在有一个开放的 JIRA 允许自定义过滤器。
我想减少在 JBoss 7 上记录异常的长度,同时尽可能少地丢失有价值的信息。我想做的是过滤掉任何 JBoss 中间件堆栈帧,这些堆栈帧通常无法深入了解应用程序代码中的实际问题。 我尝试过滤的帧示例:"at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)" 或“在 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("Validation"))" />
</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("Validation", "Im here!!!!")" />
<filter-spec value="not(match("Validation"))" />
</console-handler>
但是,当我尝试用异常堆栈跟踪框架代替常规日志条目时,它不起作用。我尝试使用的过滤器规格是:
<filter-spec value="substituteAll("sun.reflect.NativeMethodAccessorImpl", "")" />
但是这个过滤器似乎忽略了堆栈跟踪。
任何人都可以建议一种在 JBoss 环境中过滤这些堆栈跟踪的方法吗?
不幸的是,过滤器对异常不起作用。目前也无法使用自定义过滤器。但是,您可以使用 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
中或做一些奇怪的事情,例如 make setDelegate()
添加处理程序到某种集合。
更新
我只想指出现在有一个开放的 JIRA 允许自定义过滤器。