logback-android/src/main/java/ch/qos/logback/classic/pattern/EnsureExceptionHandling.java
public void process(Context context, Converter<ILoggingEvent> head) {
    if(head == null) {
      // this should never happen
      throw new IllegalArgumentException("cannot process empty chain");
    }
    if (!chainHandlesThrowable(head)) {
      Converter<ILoggingEvent> tail = ConverterUtil.findTail(head);
      Converter<ILoggingEvent> exConverter = null;
      LoggerContext loggerContext = (LoggerContext) context;
      if (loggerContext.isPackagingDataEnabled()) {
        exConverter = new ExtendedThrowableProxyConverter();
      } else {
        exConverter = new ThrowableProxyConverter();
      }
      tail.setNext(exConverter);
    }
  }
public void process(Context context, Converter<ILoggingEvent> head) {
    if(head == null) {
      // this should never happen
      throw new IllegalArgumentException("cannot process empty chain");
    }
    if (!chainHandlesThrowable(head)) {
      Converter<ILoggingEvent> tail = ConverterUtil.findTail(head);
      Converter<ILoggingEvent> exConverter = null;
      LoggerContext loggerContext = (LoggerContext) context;
      if (loggerContext.isPackagingDataEnabled()) {
        exConverter = new ExtendedThrowableProxyConverter();
      } else {
        exConverter = new ThrowableProxyConverter();
      }
      tail.setNext(exConverter);
    }
  }
This implementation checks if any of the converters in the chain handles
exceptions. If not, then this method adds a
{@link ThrowableProxyConverter} instance to the end of the chain.
<p>
This allows appenders using this layout to output exception information
event if the user forgets to add %ex to the pattern. Note that the
appenders defined in the Core package are not aware of exceptions nor
LoggingEvents.
<p>
If for some reason the user wishes to NOT print exceptions, then she can
add %nopex to the pattern.