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