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>