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:59:53 UTC

svn commit: r1670696 - in /logging/log4net/trunk/src: log4net.Tests/Appender/AsyncAppenderTest.cs log4net/Appender/AsyncAppender.cs

Author: bodewig
Date: Wed Apr  1 15:59:53 2015
New Revision: 1670696

URL: http://svn.apache.org/r1670696
Log:
LOG4NET-407 don't start new threads if appender has been closed

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

Modified: logging/log4net/trunk/src/log4net.Tests/Appender/AsyncAppenderTest.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.Tests/Appender/AsyncAppenderTest.cs?rev=1670696&r1=1670695&r2=1670696&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.Tests/Appender/AsyncAppenderTest.cs (original)
+++ logging/log4net/trunk/src/log4net.Tests/Appender/AsyncAppenderTest.cs Wed Apr  1 15:59:53 2015
@@ -89,6 +89,17 @@ namespace log4net.Tests.Appender
             Assert.AreEqual("WARN - fooWARN - barWARN - bazWARN - xyzzy", log);
         }
 
+        [Test]
+        public void ShouldNotLogAfterClose() {
+            ILogger logger = hierarchy.GetLogger("test");
+            logger.Log(GetType(), Level.Warn, "foo", null);
+            Thread.Sleep(200);
+            hierarchy.Shutdown();
+            logger.Log(GetType(), Level.Warn, "bar", null);
+            string log = WaitSomeTimeAndReturnLogWithLineFeedsStripped();
+            Assert.AreEqual("WARN - foo", log);
+        }
+
         private string WaitSomeTimeAndReturnLogWithLineFeedsStripped() {
             Thread.Sleep(200);
             return stringAppender.GetString().Replace(Environment.NewLine, string.Empty);

Modified: logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs?rev=1670696&r1=1670695&r2=1670696&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs (original)
+++ logging/log4net/trunk/src/log4net/Appender/AsyncAppender.cs Wed Apr  1 15:59:53 2015
@@ -72,6 +72,10 @@ namespace log4net.Appender
 			loggingEvent.Fix = m_fixFlags;
 			lock (lockObject)
 			{
+				if (closed)
+				{
+					return;
+				}
 				events.Add(loggingEvent);
 			}
 			ThreadPool.QueueUserWorkItem(AsyncAppend, null);
@@ -94,11 +98,36 @@ namespace log4net.Appender
 			}
 			lock (lockObject)
 			{
+				if (closed)
+				{
+					return;
+				}
 				events.AddRange(loggingEvents);
 			}
 			ThreadPool.QueueUserWorkItem(AsyncAppend, null);
 		}
 
+		/// <summary>
+		/// Closes the appender and releases resources.
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// Releases any resources allocated within the appender such as file handles, 
+		/// network connections, etc.
+		/// </para>
+		/// <para>
+		/// It is a programming error to append to a closed appender.
+		/// </para>
+		/// </remarks>
+		override protected void OnClose()
+		{
+			lock (lockObject)
+			{
+				closed = true;
+			}
+			base.OnClose();
+		}
+
 		private void AsyncAppend(object state)
 		{
 			lock (lockObject)
@@ -139,5 +168,6 @@ namespace log4net.Appender
 		private readonly object lockObject = new object();
 		private readonly List<LoggingEvent> events = new List<LoggingEvent>();
 		private bool inLoggingLoop = false;
+		private bool closed = false;
 	}
 }