Author: bodewig
Date: Wed Apr  1 15:08:36 2015
New Revision: 1670665

URL: http://svn.apache.org/r1670665
Log:
LOG4NET-407 use a queue of events to ensure order is maintained

Modified:
    logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs

Modified: logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs?rev=1670665&r1=1670664&r2=1670665&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs (original)
+++ logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs Wed Apr  1 
15:08:36 2015
@@ -18,6 +18,7 @@
 #endregion
 
 using System;
+using System.Collections.Generic;
 using System.Threading;
 using log4net.Appender;
 using log4net.Core;
@@ -69,7 +70,11 @@ namespace log4net.Appender
                override protected void Append(LoggingEvent loggingEvent) 
                {
                        loggingEvent.Fix = m_fixFlags;
-                       ThreadPool.QueueUserWorkItem(AsyncAppend, loggingEvent);
+                       lock (lockObject)
+                       {
+                               events.Add(loggingEvent);
+                       }
+                       ThreadPool.QueueUserWorkItem(AsyncAppend, null);
                }
 
                /// <summary>
@@ -87,23 +92,52 @@ namespace log4net.Appender
                        {
                                loggingEvent.Fix = m_fixFlags;
                        }
-                       ThreadPool.QueueUserWorkItem(AsyncAppend, 
loggingEvents);
+                       lock (lockObject)
+                       {
+                               events.AddRange(loggingEvents);
+                       }
+                       ThreadPool.QueueUserWorkItem(AsyncAppend, null);
                }
 
                private void AsyncAppend(object state)
                {
-                       LoggingEvent loggingEvent = state as LoggingEvent;
-                       LoggingEvent[] loggingEvents = state as LoggingEvent[];
-                       if (loggingEvent != null)
+                       lock (lockObject)
+                       {
+                               if (inLoggingLoop)
+                               {
+                                       return;
+                               }
+                               inLoggingLoop = true;
+                       }
+                       try
                        {
-                               base.Append(loggingEvent);
+                               while (true)
+                               {
+                                       LoggingEvent[] loggingEvents = null;
+                                       lock (lockObject)
+                                       {
+                                               loggingEvents = 
events.ToArray();
+                                               events.Clear();
+                                       }
+                                       if (loggingEvents.Length == 0)
+                                       {
+                                               break;
+                                       }
+                                       base.Append(loggingEvents);
+                               }
                        }
-                       else if (loggingEvents != null)
+                       finally
                        {
-                               base.Append(loggingEvents);
+                               lock (lockObject)
+                               {
+                                       inLoggingLoop = false;
+                               }
                        }
                }
 
                private FixFlags m_fixFlags = FixFlags.All;
+               private readonly object lockObject = new object();
+               private readonly List<LoggingEvent> events = new 
List<LoggingEvent>();
+               private bool inLoggingLoop = false;
        }
 }


Reply via email to