You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by bo...@apache.org on 2015/04/01 17:08:36 UTC

svn commit: r1670665 - /logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs

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;
 	}
 }