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