Author: rgrabowski
Date: Wed Dec 20 17:28:51 2006
New Revision: 489241
URL: http://svn.apache.org/viewvc?view=rev&rev=489241
Log:
Fix for LOG4NET-107. Added ExceptionEvaluator that triggers a
BufferingAppenderSkeleton to flush its buffer when a certain Exception is
detected.
Added:
logging/log4net/trunk/src/Core/ExceptionEvaluator.cs
Modified:
logging/log4net/trunk/src/log4net.csproj
logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs
Added: logging/log4net/trunk/src/Core/ExceptionEvaluator.cs
URL:
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Core/ExceptionEvaluator.cs?view=auto&rev=489241
==============================================================================
--- logging/log4net/trunk/src/Core/ExceptionEvaluator.cs (added)
+++ logging/log4net/trunk/src/Core/ExceptionEvaluator.cs Wed Dec 20 17:28:51
2006
@@ -0,0 +1,129 @@
+#region Copyright & License
+//
+// Copyright 2001-2006 The Apache Software Foundation
+//
+// Licensed 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.
+//
+#endregion
+
+using System;
+
+namespace log4net.Core
+{
+ /// <summary>
+ /// An evaluator that triggers on an Exception type
+ /// </summary>
+ /// <remarks>
+ /// <para>
+ /// This evaluator will trigger if the type of the Exception
+ /// passed to <see cref="IsTriggeringEvent(LoggingEvent)"/>
+ /// is equal to a Type in <see cref="ExceptionType"/>. ///
+ /// </para>
+ /// </remarks>
+ /// <author>Drew Schaeffer</author>
+ public class ExceptionEvaluator : ITriggeringEventEvaluator
+ {
+ /// <summary>
+ /// The type that causes the trigger to fire.
+ /// </summary>
+ private Type m_type;
+
+ /// <summary>
+ /// Causes subclasses of <see cref="ExceptionType"/> to cause
the trigger to fire.
+ /// </summary>
+ private bool m_triggerOnSubclass;
+
+ /// <summary>
+ /// Default ctor to allow dynamic creation through a
configurator.
+ /// </summary>
+ public ExceptionEvaluator()
+ {
+ // empty
+ }
+
+ /// <summary>
+ /// Constructs an evaluator and initializes to trigger on
<paramref name="exType"/>
+ /// </summary>
+ /// <param name="exType">the type that triggers this
evaluator.</param>
+ /// <param name="triggerOnSubClass">If true, this evaluator
will trigger on subclasses of <see cref="ExceptionType"/>.</param>
+ public ExceptionEvaluator(Type exType, bool triggerOnSubClass)
+ {
+ if (exType == null)
+ {
+ throw new ArgumentNullException("exType");
+ }
+
+ m_type = exType;
+ m_triggerOnSubclass = triggerOnSubClass;
+ }
+
+ /// <summary>
+ /// The type that triggers this evaluator.
+ /// </summary>
+ public Type ExceptionType
+ {
+ get { return m_type; }
+ set { m_type = value; }
+ }
+
+ /// <summary>
+ /// If true, this evaluator will trigger on subclasses of <see
cref="ExceptionType"/>.
+ /// </summary>
+ public bool TriggerOnSubclass
+ {
+ get { return m_triggerOnSubclass; }
+ set { m_triggerOnSubclass = value; }
+ }
+
+ #region ITriggeringEventEvaluator Members
+
+ /// <summary>
+ /// Is this <paramref name="loggingEvent"/> the triggering
event?
+ /// </summary>
+ /// <param name="loggingEvent">The event to check</param>
+ /// <returns>This method returns <c>true</c>, if the logging
event Exception
+ /// Type is <see cref="ExceptionType"/>.
+ /// Otherwise it returns <c>false</c></returns>
+ /// <remarks>
+ /// <para>
+ /// This evaluator will trigger if the Exception Type of the
event
+ /// passed to <see cref="IsTriggeringEvent(LoggingEvent)"/>
+ /// is <see cref="ExceptionType"/>.
+ /// </para>
+ /// </remarks>
+ public bool IsTriggeringEvent(LoggingEvent loggingEvent)
+ {
+ if (loggingEvent == null)
+ {
+ throw new ArgumentNullException("loggingEvent");
+ }
+
+ if (m_triggerOnSubclass && loggingEvent.ExceptionObject
!= null)
+ {
+ // check if loggingEvent.ExceptionObject is of
type ExceptionType or subclass of ExceptionType
+ Type exceptionObjectType =
loggingEvent.ExceptionObject.GetType();
+ return exceptionObjectType == m_type ||
exceptionObjectType.IsSubclassOf(m_type);
+ }
+ else if (!m_triggerOnSubclass &&
loggingEvent.ExceptionObject != null)
+ { // check if loggingEvent.ExceptionObject is of type
ExceptionType
+ return loggingEvent.ExceptionObject.GetType()
== m_type;
+ }
+ else
+ { // loggingEvent.ExceptionObject is null
+ return false;
+ }
+ }
+
+ #endregion
+ }
+}
Modified: logging/log4net/trunk/src/log4net.csproj
URL:
http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.csproj?view=diff&rev=489241&r1=489240&r2=489241
==============================================================================
--- logging/log4net/trunk/src/log4net.csproj (original)
+++ logging/log4net/trunk/src/log4net.csproj Wed Dec 20 17:28:51 2006
@@ -343,6 +343,11 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "Core\ExceptionEvaluator.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "Core\IAppenderAttachable.cs"
SubType = "Code"
BuildAction = "Compile"
Modified: logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs
URL:
http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs?view=diff&rev=489241&r1=489240&r2=489241
==============================================================================
--- logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs (original)
+++ logging/log4net/trunk/tests/src/Core/EvaluatorTest.cs Wed Dec 20 17:28:51
2006
@@ -49,11 +49,10 @@
Assert.AreEqual(3, m_countingAppender.Counter, "Test 3
events flushed on Info message.");
}
- /*
[Test]
public void TestExceptionEvaluator()
{
- m_bufferingForwardingAppender.Evaluator = new
ExceptionEvaluator(typeof(ApplicationException));
+ m_bufferingForwardingAppender.Evaluator = new
ExceptionEvaluator(typeof(ApplicationException), true);
m_bufferingForwardingAppender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(m_hierarchy,
m_bufferingForwardingAppender);
@@ -105,7 +104,7 @@
public void TestInvalidExceptionEvaluator()
{
// warning: String is not a subclass of Exception
- m_bufferingForwardingAppender.Evaluator = new
ExceptionEvaluator(typeof(String));
+ m_bufferingForwardingAppender.Evaluator = new
ExceptionEvaluator(typeof(String), false);
m_bufferingForwardingAppender.ActivateOptions();
log4net.Config.BasicConfigurator.Configure(m_hierarchy,
m_bufferingForwardingAppender);
@@ -118,6 +117,5 @@
logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn
message logged", new ApplicationException());
Assert.AreEqual(0, m_countingAppender.Counter, "Test 3
events buffered");
}
- */
}
}