Hi Robert,<div><br></div><div>Thanks, I'll bookmark this. Â Having said that, I suspect there's a simpler way using EventEvaluator but I can't see how to wire that up to the exception conversion handler. Â Simpler meaning here "installing one class as opposed to wrapping up many classes", or "one extra line of Java code and a little class to go along with it".</div>

<div><br></div><div>Also, if I understand your code correctly, it filters frames (e.g.: if there's a frame in the middle of the stack with org.codehaus.groovy.runtime.*, it gets dropped without necessarily affecting frames higher up or lower down), whereas the EventEvaluator acts as a cut-off ("don't go any further down").</div>

<div><br></div><div>Even if it's not exactly what I was looking for, I can see other cases where I could apply what you've suggested, so thanks again!</div><div><br></div><div>--<br>Christopher<br>
<br><br><div class="gmail_quote">On 5 December 2011 14:33, Robert Elliot <span dir="ltr"><<a href="mailto:rob@lidalia.org.uk">rob@lidalia.org.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

I've done something very similar to this here:<br>
<a href="https://github.com/Mahoney/lidalia-logging/" target="_blank">https://github.com/Mahoney/lidalia-logging/</a><br>
<br>
Basically using the decorator pattern around Events.<br>
<br>
Specifically look at EventTransformingAppender and StackTraceCleanser, and have a look at src/main/resources/logback.xml to see how to configure it. Â It's currently very specific to getting rid of Groovy noise, but it would be trivial to generalise it to get rid of other frames.<br>


<div><div class="h5"><br>
<br>
<br>
----- Original Message -----<br>
> From: "Christopher BROWN" <<a href="mailto:brown@reflexe.fr">brown@reflexe.fr</a>><br>
> To: "LogBack Users list" <<a href="mailto:logback-user@qos.ch">logback-user@qos.ch</a>><br>
> Sent: Monday, 5 December, 2011 11:44:25 AM<br>
> Subject: [logback-user] Filtering stacktraces by evaluating packages<br>
> Hello,<br>
><br>
><br>
> I would like to simplify stacktraces when errors occur in an<br>
> application. For example, with a hypothetical stack such as:<br>
><br>
><br>
><br>
><br>
> com.xyz.Wombat.doSomething<br>
> javax.servlet.http.HttpServlet.service<br>
> org.appserver.JspCompiler.handleJsp<br>
> org.appserver.ServletEngine.handleServlet<br>
> java.lang.Thread.run<br>
><br>
><br>
> ...going down from top-to-bottom, I'd like to detect that line<br>
> "org.appserver.JspCompiler.handleJsp" has been found, and exclude it<br>
> -- and all subsequent "lower down" stack frames -- from logging<br>
> output.<br>
><br>
><br>
> Looking at <a href="http://logback.qos.ch/manual/layouts.html#Evaluators" target="_blank">http://logback.qos.ch/manual/layouts.html#Evaluators</a> I<br>
> assume it must be possible with EventEvaluator because of the syntax<br>
> %xEx{evaluator-n} but I can't find an example. Furthermore, as I set<br>
> up LogBack programmatically (and not via XML or any of bundled<br>
> "configurator"), I'd be happiest if I could be directed towards an<br>
> API-based example.<br>
><br>
><br>
> If it's of any use, here are two methods extracted from the class that<br>
> I use to configure LogBack (incomplete but should help see what I'm<br>
> trying to do, and how):<br>
><br>
><br>
><br>
> private synchronized boolean maybeInitialize(final Logger logger,<br>
> String pattern)<br>
> {<br>
> // will throw ClassCastException if our configuration is incorrect (or<br>
> accessed from wrong classloader)<br>
> // that's OK, it's what should happen...<br>
> final ch.qos.logback.classic.Logger impl =<br>
> (ch.qos.logback.classic.Logger)logger;<br>
><br>
><br>
> // if there's an appender, then the logger seems to have been<br>
> configured<br>
> Iterator<Appender<ILoggingEvent>> it = impl.iteratorForAppenders();<br>
> if (it.hasNext())<br>
> {<br>
> return false;<br>
> }<br>
><br>
><br>
> String logFileName = impl.getName();<br>
> if (logFileName.startsWith(LOG_FILE_STDPREFIX) && logFileName.length()<br>
> > LOG_FILE_STDPREFIX.length())<br>
> {<br>
> logFileName = logFileName.substring(LOG_FILE_STDPREFIX.length());<br>
> }<br>
> logFileName += LOG_FILE_EXTENSION;<br>
><br>
><br>
> Appender<ILoggingEvent> appender;<br>
> if (CONFIG_VALUE_ROLL_TYPE_DATE.equals(_rollType))<br>
> {<br>
> appender = createRollByDateFileAppender(logFileName, pattern != null ?<br>
> pattern : PATTERN_FOR_DATE);<br>
> }<br>
> else if (CONFIG_VALUE_ROLL_TYPE_SIZE.equals(_rollType))<br>
> {<br>
> appender = createRollBySizeFileAppender(logFileName, pattern);<br>
> }<br>
> else<br>
> {<br>
> appender = createFileAppender(logFileName, pattern);<br>
> }<br>
><br>
><br>
> appender.start();<br>
><br>
><br>
> impl.addAppender(appender);<br>
> impl.setLevel(_level);<br>
> impl.setAdditive(false);<br>
><br>
><br>
> return true;<br>
> }<br>
><br>
><br>
><br>
> private synchronized boolean maybeInitialize(final Logger logger,<br>
> String pattern)<br>
> {<br>
> // will throw ClassCastException if our configuration is incorrect (or<br>
> accessed from wrong classloader)<br>
> // that's OK, it's what should happen...<br>
> final ch.qos.logback.classic.Logger impl =<br>
> (ch.qos.logback.classic.Logger)logger;<br>
><br>
><br>
> // if there's an appender, then the logger seems to have been<br>
> configured<br>
> Iterator<Appender<ILoggingEvent>> it = impl.iteratorForAppenders();<br>
> if (it.hasNext())<br>
> {<br>
> return false;<br>
> }<br>
><br>
><br>
> String logFileName = impl.getName();<br>
> if (logFileName.startsWith(LOG_FILE_STDPREFIX) && logFileName.length()<br>
> > LOG_FILE_STDPREFIX.length())<br>
> {<br>
> logFileName = logFileName.substring(LOG_FILE_STDPREFIX.length());<br>
> }<br>
> logFileName += LOG_FILE_EXTENSION;<br>
><br>
><br>
> Appender<ILoggingEvent> appender;<br>
> if (CONFIG_VALUE_ROLL_TYPE_DATE.equals(_rollType))<br>
> {<br>
> appender = createRollByDateFileAppender(logFileName, pattern != null ?<br>
> pattern : PATTERN_FOR_DATE);<br>
> }<br>
> else if (CONFIG_VALUE_ROLL_TYPE_SIZE.equals(_rollType))<br>
> {<br>
> appender = createRollBySizeFileAppender(logFileName, pattern);<br>
> }<br>
> else<br>
> {<br>
> appender = createFileAppender(logFileName, pattern);<br>
> }<br>
><br>
><br>
> appender.start();<br>
><br>
><br>
> impl.addAppender(appender);<br>
> impl.setLevel(_level);<br>
> impl.setAdditive(false);<br>
><br>
><br>
> return true;<br>
> }<br>
><br>
><br>
><br>
> Thanks,<br>
> Christopher<br>
><br>
</div></div>> _______________________________________________<br>
> Logback-user mailing list<br>
> <a href="mailto:Logback-user@qos.ch">Logback-user@qos.ch</a><br>
> <a href="http://mailman.qos.ch/mailman/listinfo/logback-user" target="_blank">http://mailman.qos.ch/mailman/listinfo/logback-user</a><br>
_______________________________________________<br>
Logback-user mailing list<br>
<a href="mailto:Logback-user@qos.ch">Logback-user@qos.ch</a><br>
<a href="http://mailman.qos.ch/mailman/listinfo/logback-user" target="_blank">http://mailman.qos.ch/mailman/listinfo/logback-user</a><br>
</blockquote></div><br></div>