allow the logging system to recursively log using itself patch by @JJoe2 closes #41
Project: http://git-wip-us.apache.org/repos/asf/logging-log4net/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4net/commit/b8189d16 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4net/tree/b8189d16 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4net/diff/b8189d16 Branch: refs/heads/master Commit: b8189d16a65ba9e0aa76ed7dfb8242caef2da388 Parents: 8b4bc63 Author: Stefan Bodewig <bode...@apache.org> Authored: Thu Feb 2 11:26:18 2017 +0000 Committer: Stefan Bodewig <bode...@apache.org> Committed: Thu Feb 2 11:26:18 2017 +0000 ---------------------------------------------------------------------- src/Util/ReaderWriterLock.cs | 2 +- tests/src/Appender/EventRaisingAppender.cs | 58 +++++++++++++++++ tests/src/Appender/RecursiveLoggingTest.cs | 84 +++++++++++++++++++++++++ tests/src/log4net.Tests.vs2012.csproj | 2 + 4 files changed, 145 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/b8189d16/src/Util/ReaderWriterLock.cs ---------------------------------------------------------------------- diff --git a/src/Util/ReaderWriterLock.cs b/src/Util/ReaderWriterLock.cs index 5ed53c5..807a3da 100644 --- a/src/Util/ReaderWriterLock.cs +++ b/src/Util/ReaderWriterLock.cs @@ -64,7 +64,7 @@ namespace log4net.Util #if HAS_READERWRITERLOCK #if HAS_READERWRITERLOCKSLIM - m_lock = new System.Threading.ReaderWriterLockSlim(); + m_lock = new System.Threading.ReaderWriterLockSlim(System.Threading.LockRecursionPolicy.SupportsRecursion); #else m_lock = new System.Threading.ReaderWriterLock(); #endif http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/b8189d16/tests/src/Appender/EventRaisingAppender.cs ---------------------------------------------------------------------- diff --git a/tests/src/Appender/EventRaisingAppender.cs b/tests/src/Appender/EventRaisingAppender.cs new file mode 100644 index 0000000..517b6bd --- /dev/null +++ b/tests/src/Appender/EventRaisingAppender.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace log4net.Tests.Appender +{ + /// <summary> + /// Provides data for the <see cref="EventRaisingAppender.LoggingEventAppended"/> event. + /// </summary> + /// <seealso cref="System.EventArgs" /> + public class LoggingEventEventArgs : EventArgs + { + public log4net.Core.LoggingEvent LoggingEvent { get; private set; } + + public LoggingEventEventArgs(log4net.Core.LoggingEvent loggingEvent) + { + if (loggingEvent == null) throw new ArgumentNullException("loggingEvent"); + LoggingEvent = loggingEvent; + } + } + + /// <summary> + /// A log4net appender that raises an event each time a logging event is appended + /// </summary> + /// <remarks> + /// This class is intended to provide a way for test code to inspect logging + /// events as they are generated. + /// </remarks> + public class EventRaisingAppender : log4net.Appender.IAppender + { + public event EventHandler<LoggingEventEventArgs> LoggingEventAppended; + + protected void OnLoggingEventAppended(LoggingEventEventArgs e) + { + var loggingEventAppended = LoggingEventAppended; + if (loggingEventAppended != null) + { + loggingEventAppended(this, e); + } + } + + public void Close() + { + } + + public void DoAppend(log4net.Core.LoggingEvent loggingEvent) + { + OnLoggingEventAppended(new LoggingEventEventArgs(loggingEvent)); + } + + public string Name + { + get; set; + } + } +} http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/b8189d16/tests/src/Appender/RecursiveLoggingTest.cs ---------------------------------------------------------------------- diff --git a/tests/src/Appender/RecursiveLoggingTest.cs b/tests/src/Appender/RecursiveLoggingTest.cs new file mode 100644 index 0000000..4b9aeb2 --- /dev/null +++ b/tests/src/Appender/RecursiveLoggingTest.cs @@ -0,0 +1,84 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +using System; +using System.Data; +using System.Xml; +using log4net.Appender; +using log4net.Config; +using log4net.Core; +using log4net.Layout; +using log4net.Repository; +using log4net.Util; +using NUnit.Framework; +using System.Globalization; + +namespace log4net.Tests.Appender +{ + [TestFixture] + public class RecursiveLoggingTest + { + private EventRaisingAppender m_eventRaisingAppender; + private Repository.Hierarchy.Hierarchy m_hierarchy; + private int m_eventCount; + private ILogger m_logger; + private const int MaxRecursion = 3; + + private void SetupRepository() + { + m_hierarchy = new Repository.Hierarchy.Hierarchy(); + + m_eventRaisingAppender = new EventRaisingAppender(); + m_eventRaisingAppender.LoggingEventAppended += eventRaisingAppender_LoggingEventAppended; + + m_hierarchy.Root.Level = Level.All; + m_hierarchy.Root.AddAppender(m_eventRaisingAppender); + + BasicConfigurator.Configure(m_hierarchy, m_eventRaisingAppender); + + m_logger = m_hierarchy.GetLogger("test"); + + } + + void eventRaisingAppender_LoggingEventAppended(object sender, LoggingEventEventArgs e) + { + if (m_eventCount < MaxRecursion && m_logger != null) + { + m_eventCount++; + string message = String.Format(CultureInfo.CurrentCulture, "Log event {0} from EventRaisingAppender", m_eventCount); + Console.WriteLine("Logging message: " + message); + m_logger.Log(typeof(RecursiveLoggingTest), Level.Warn, message, null); + } + } + + [Test] + public void TestAllowRecursiveLoggingFromAppender() + { + SetupRepository(); + + m_eventCount = 0; + m_logger.Log(typeof(RecursiveLoggingTest), Level.Warn, "Message logged", null); + + Assert.AreEqual(MaxRecursion, m_eventCount, "Expected MaxRecursion recursive calls"); + } + + } +} http://git-wip-us.apache.org/repos/asf/logging-log4net/blob/b8189d16/tests/src/log4net.Tests.vs2012.csproj ---------------------------------------------------------------------- diff --git a/tests/src/log4net.Tests.vs2012.csproj b/tests/src/log4net.Tests.vs2012.csproj index 633afd2..81bbb16 100644 --- a/tests/src/log4net.Tests.vs2012.csproj +++ b/tests/src/log4net.Tests.vs2012.csproj @@ -150,9 +150,11 @@ <Compile Include="Appender\EventLogAppenderTest.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="Appender\EventRaisingAppender.cs" /> <Compile Include="Appender\MemoryAppenderTest.cs"> <SubType>Code</SubType> </Compile> + <Compile Include="Appender\RecursiveLoggingTest.cs" /> <Compile Include="Appender\RemotingAppenderTest.cs"> <SubType>Code</SubType> </Compile>