diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
index 4f4f4da..c81cb28 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLogger.java
@@ -88,6 +88,17 @@ public class AsyncLogger extends Logger {
     private static ThreadLocal<Info> threadlocalInfo = new ThreadLocal<Info>();
 
     static {
+    	executor.execute(new Runnable(){
+			@Override
+			public void run() {
+				// preload ThreadLocal Info for AsyncLogger thread to avoid messy
+				// determine-by-threadname checks for isLoggingThread in log()
+				final Info info = new Info();
+				info.cachedThreadName = Thread.currentThread().getName();
+				info.translator = new RingBufferLogEventTranslator();
+				info.isLoggingThread = true;
+				threadlocalInfo.set(info);
+			}});
         final int ringBufferSize = calculateRingBufferSize();
 
         final WaitStrategy waitStrategy = createWaitStrategy();
@@ -174,6 +185,7 @@ public class AsyncLogger extends Logger {
     private static class Info {
         private RingBufferLogEventTranslator translator;
         private String cachedThreadName;
+        private boolean isLoggingThread;
     }
 
     @Override
@@ -183,35 +195,42 @@ public class AsyncLogger extends Logger {
             info = new Info();
             info.translator = new RingBufferLogEventTranslator();
             info.cachedThreadName = Thread.currentThread().getName();
+            info.isLoggingThread = false;
             threadlocalInfo.set(info);
         }
+        if(info.isLoggingThread && disruptor.getRingBuffer().remainingCapacity()==0)
+        {
+        	config.loggerConfig.log(getName(), marker, fqcn, level, data, t);
+        }
+        else
+        {
+            final boolean includeLocation = config.loggerConfig.isIncludeLocation();
+            info.translator.setValues(this, getName(), marker, fqcn, level, data, t, //
 
-        final boolean includeLocation = config.loggerConfig.isIncludeLocation();
-        info.translator.setValues(this, getName(), marker, fqcn, level, data, t, //
-
-                // config properties are taken care of in the EventHandler
-                // thread in the #actualAsyncLog method
+                    // config properties are taken care of in the EventHandler
+                    // thread in the #actualAsyncLog method
 
-                // needs shallow copy to be fast (LOG4J2-154)
-                ThreadContext.getImmutableContext(), //
+                    // needs shallow copy to be fast (LOG4J2-154)
+                    ThreadContext.getImmutableContext(), //
 
-                // needs shallow copy to be fast (LOG4J2-154)
-                ThreadContext.getImmutableStack(), //
+                    // needs shallow copy to be fast (LOG4J2-154)
+                    ThreadContext.getImmutableStack(), //
 
-                // Thread.currentThread().getName(), //
-                info.cachedThreadName, //
+                    // Thread.currentThread().getName(), //
+                    info.cachedThreadName, //
 
-                // location: very expensive operation. LOG4J2-153:
-                // Only include if "includeLocation=true" is specified,
-                // exclude if not specified or if "false" was specified.
-                includeLocation ? location(fqcn) : null,
+                    // location: very expensive operation. LOG4J2-153:
+                    // Only include if "includeLocation=true" is specified,
+                    // exclude if not specified or if "false" was specified.
+                    includeLocation ? location(fqcn) : null,
 
-                // System.currentTimeMillis());
-                // CoarseCachedClock: 20% faster than system clock, 16ms gaps
-                // CachedClock: 10% faster than system clock, smaller gaps
-                clock.currentTimeMillis());
+                    // System.currentTimeMillis());
+                    // CoarseCachedClock: 20% faster than system clock, 16ms gaps
+                    // CachedClock: 10% faster than system clock, smaller gaps
+                    clock.currentTimeMillis());
 
-        disruptor.publishEvent(info.translator);
+            disruptor.publishEvent(info.translator);
+        }
     }
 
     private StackTraceElement location(final String fqcnOfLogger) {
