code: public void append(final LoggingEvent event) {
      //
      //   if dispatcher thread has died then
      //      append subsequent events synchronously
      //   See bug 23021
      if (!dispatcher.isAlive() || (bufferSize <= 0)) {
        appenders.appendLoopOnAppenders(event);
  
        return;
      }
  
      // Set the NDC and thread name for the calling thread as these
      // LoggingEvent fields were not set at event creation time.
      event.getNDC();
      event.getThreadName();
      // Get a copy of this thread's MDC.
      event.getMDCCopy();
      if (locationInfo) {
        event.getLocationInformation();
      }
      event.getRenderedMessage();
      event.getThrowableStrRep();
  
      synchronized (buffer) {
        while (true) {
          int previousSize = buffer.size();
  
          if (previousSize < bufferSize) {
            buffer.add(event);
  
            //
            //   if buffer had been empty
            //       signal all threads waiting on buffer
            //       to check their conditions.
            //
            if (previousSize == 0) {
              buffer.notifyAll();
            }
  
            break;
          }
  
          //
          //   Following code is only reachable if buffer is full
          //
          //
          //   if blocking and thread is not already interrupted
          //      and not the dispatcher then
          //      wait for a buffer notification
          boolean discard = true;
          if (blocking
                  && !Thread.interrupted()
                  && Thread.currentThread() != dispatcher) {
            try {
              buffer.wait();
              discard = false;
            } catch (InterruptedException e) {
              //
              //  reset interrupt status so
              //    calling code can see interrupt on
              //    their next wait or sleep.
              Thread.currentThread().interrupt();
            }
          }
  
          //
          //   if blocking is false or thread has been interrupted
          //   add event to discard map.
          //
          if (discard) {
            String loggerName = event.getLoggerName();
            DiscardSummary summary = (DiscardSummary) discardMap.get(loggerName);
  
            if (summary == null) {
              summary = new DiscardSummary(event);
              discardMap.put(loggerName, summary);
            } else {
              summary.add(event);
            }
  
            break;
          }
        }
      }
    }
docs: {@inheritDoc}