Hello,<div><br></div><div>I would like to simplify stacktraces when errors occur in an application.  For example, with a hypothetical stack such as:</div><div><br></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">

<div><font class="Apple-style-span" face="'courier new', monospace">com.xyz.Wombat.doSomething</font></div><div><font class="Apple-style-span" face="'courier new', monospace">javax.servlet.http.HttpServlet.service</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">org.appserver.JspCompiler.handleJsp</font></div><div><font class="Apple-style-span" face="'courier new', monospace">org.appserver.ServletEngine.handleServlet</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">java.lang.Thread.run</font></div></blockquote><div><br></div><div>...going down from top-to-bottom, I'd like to detect that line "org.appserver.JspCompiler.handleJsp" has been found, and exclude it -- and all subsequent "lower down" stack frames -- from logging output.</div>

<div><br></div><div>Looking at <a href="http://logback.qos.ch/manual/layouts.html#Evaluators">http://logback.qos.ch/manual/layouts.html#Evaluators</a> I assume it must be possible with EventEvaluator because of the syntax %xEx{evaluator-n} but I can't find an example.  Furthermore, as I set up LogBack programmatically (and not via XML or any of bundled "configurator"), I'd be happiest if I could be directed towards an API-based example.</div>

<div><br></div><div>If it's of any use, here are two methods extracted from the class that I use to configure LogBack (incomplete but should help see what I'm trying to do, and how):</div><div><br></div><div><div>

<font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>private synchronized boolean maybeInitialize(final Logger logger, String pattern)</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">     </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>// will throw ClassCastException if our configuration is incorrect (or accessed from wrong classloader)</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>// that's OK, it's what should happen...</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">               </span>final ch.qos.logback.classic.Logger impl = (ch.qos.logback.classic.Logger)logger;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>// if there's an appender, then the logger seems to have been configured</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>Iterator<Appender<ILoggingEvent>> it = impl.iteratorForAppenders();</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>if (it.hasNext())</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>{</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                     </span>return false;</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">          </span>}</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>String logFileName = impl.getName();</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>if (logFileName.startsWith(LOG_FILE_STDPREFIX) && logFileName.length() > LOG_FILE_STDPREFIX.length())</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                      </span>logFileName = logFileName.substring(LOG_FILE_STDPREFIX.length());</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>logFileName += LOG_FILE_EXTENSION;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>Appender<ILoggingEvent> appender;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>if (CONFIG_VALUE_ROLL_TYPE_DATE.equals(_rollType))</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                     </span>appender = createRollByDateFileAppender(logFileName, pattern != null ? pattern : PATTERN_FOR_DATE);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>else if (CONFIG_VALUE_ROLL_TYPE_SIZE.equals(_rollType))</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                      </span>appender = createRollBySizeFileAppender(logFileName, pattern);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>else</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                      </span>appender = createFileAppender(logFileName, pattern);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>appender.start();</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>impl.addAppender(appender);</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>impl.setLevel(_level);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>impl.setAdditive(false);</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>return true;</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">   </span>}</font></div>

</div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">       </span>private synchronized boolean maybeInitialize(final Logger logger, String pattern)</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">     </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>// will throw ClassCastException if our configuration is incorrect (or accessed from wrong classloader)</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>// that's OK, it's what should happen...</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">               </span>final ch.qos.logback.classic.Logger impl = (ch.qos.logback.classic.Logger)logger;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>// if there's an appender, then the logger seems to have been configured</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>Iterator<Appender<ILoggingEvent>> it = impl.iteratorForAppenders();</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>if (it.hasNext())</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>{</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                     </span>return false;</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">          </span>}</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>String logFileName = impl.getName();</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>if (logFileName.startsWith(LOG_FILE_STDPREFIX) && logFileName.length() > LOG_FILE_STDPREFIX.length())</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                      </span>logFileName = logFileName.substring(LOG_FILE_STDPREFIX.length());</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>logFileName += LOG_FILE_EXTENSION;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>Appender<ILoggingEvent> appender;</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>if (CONFIG_VALUE_ROLL_TYPE_DATE.equals(_rollType))</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                     </span>appender = createRollByDateFileAppender(logFileName, pattern != null ? pattern : PATTERN_FOR_DATE);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>else if (CONFIG_VALUE_ROLL_TYPE_SIZE.equals(_rollType))</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                      </span>appender = createRollBySizeFileAppender(logFileName, pattern);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">              </span>else</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>{</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">                      </span>appender = createFileAppender(logFileName, pattern);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>}</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>appender.start();</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>impl.addAppender(appender);</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>impl.setLevel(_level);</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">             </span>impl.setAdditive(false);</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br>

</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">            </span>return true;</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><span class="Apple-tab-span" style="white-space:pre">   </span>}</font></div>

</div><div><br></div><div><br clear="all">Thanks,<br>Christopher<br>
</div>