Logback - filtering stack trace

14,869

Solution 1

This capability has been included in Logback Classic as of version 1.1.3. It seems to apply to the following Conversion Words of PatternLayout:

Solution 2

On my case I used a ThrowableConverter for the stacktrace.

You can add that to your logback.xml where you have your consoleApender, inside your encoder:

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">

            <!-- your other encoder configurations -->

            <stackTrace>
                <fieldName>stacktrace</fieldName>
                <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                    <pattern>[%thread] - %msg%n%stack{1,1024,10,rootFirst}</pattern>
                </throwableConverter>
            </stackTrace>

        </encoder>
    </appender>

It will add a field name "stack_trace" with the stack trace. And it does the job for me.

Inside stack you have the parameters:

  • maxDepthPerThrowable: Limits the number of stackTraceElements per throwable
  • maxLength: Limits the total length in characters of the trace.
  • shortenedClassNameLength: Abbreviates class names based on the shortenedClassName
  • rootCauseFirst: Outputs in either 'normal' order (root-cause-last), or root-cause-first
Share:
14,869
viniolli
Author by

viniolli

By Day: Java programmer By Night: Beer with friends, movie, book, selfdevelopment For fun: pet project in scala and angular 2

Updated on June 04, 2022

Comments

  • viniolli
    viniolli almost 2 years

    I'm using logback for logging and i found some problem with filtering stack trace. I hava a structure like this:

    public class Main {
        static final Logger logger = (Logger) LoggerFactory.getLogger(Main.class);
    
        public static void main(String[] args) {
            logger.debug("Start");
    
            MyObject1 loggingElement = new MyObject1();
            loggingElement.logg();
    
            logger.debug("End");
        }
    }
    
    
    public class MyObject1 {
    
        public MyObject2 obj;
        static final Logger logger = (Logger) LoggerFactory.getLogger(MyObject1.class);
    
        public MyObject1() {
            obj = new MyObject2();
        }
        public void logg() {
            obj.loggError();
        }
    }
    public class MyObject2 {
        static final Logger logger = (Logger) LoggerFactory.getLogger(MyObject2.class);
    
        public void loggError() {
            logger.error("Error info", new Throwable("Error"));
        }
    }
    

    and configuration xml like this:

    <property name="mask" 
                value="MyObject2"/>
    
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss} | %level | %-4thread | %-21logger | %m%n
            </pattern>
        </encoder>
    </appender>
    
    <root level="${root.level:-TRACE}">
        <appender-ref ref="STDOUT" />
    </root>
    

    When i run the main method i get output like this:

    12:29:35 | DEBUG | main | com.logging.Main      | Start
    12:29:35 | ERROR | main | com.logging.MyObject2 | Error info
    java.lang.Throwable: Error
        at com.logging.MyObject2.loggError(MyObject2.java:11) [bin/:na]
        at com.logging.MyObject1.logg(MyObject1.java:17) [bin/:na]
        at com.logging.Main.main(Main.java:14) [bin/:na]
    12:29:35 | DEBUG | main | com.logging.Main      | End
    

    i would like to remove line with 'MyObject1' in it and leave rest of stack trace untouched just like int this example: http://java.dzone.com/articles/filtering-stack-trace-hell

    i tried to change configuration of logback

    <pattern>%d{HH:mm:ss} | %level | %-4thread | %-21logger | %m%n%ex{full,${mask}}
    </pattern>
    

    doesn't work at all

    <pattern>%d{HH:mm:ss} | %level | %-4thread | %-21logger | %m%n%eXe{full,${mask}}
                </pattern>
    

    removes whole stack trace(not solution for me)

    Anyone knows anything that could help?