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 2011/12/06 16:46:54 UTC

svn commit: r1210987 - in /logging/log4net/trunk: src/ src/Layout/ tests/src/ tests/src/Layout/

Author: bodewig
Date: Tue Dec  6 15:46:53 2011
New Revision: 1210987

URL: http://svn.apache.org/viewvc?rev=1210987&view=rev
Log:
a PaternLayout subclass that re-evaluates header and footer on each call.  Submitted by Roy Chastain.  LOG4NET-316

Added:
    logging/log4net/trunk/src/Layout/DynamicPatternLayout.cs   (with props)
    logging/log4net/trunk/tests/src/Layout/DynamicPatternLayoutTest.cs   (with props)
Modified:
    logging/log4net/trunk/src/log4net.vs2008.csproj
    logging/log4net/trunk/src/log4net.vs2010.csproj
    logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs
    logging/log4net/trunk/tests/src/log4net.Tests.vs2003.csproj
    logging/log4net/trunk/tests/src/log4net.Tests.vs2008.csproj
    logging/log4net/trunk/tests/src/log4net.Tests.vs2010.csproj

Added: logging/log4net/trunk/src/Layout/DynamicPatternLayout.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/Layout/DynamicPatternLayout.cs?rev=1210987&view=auto
==============================================================================
--- logging/log4net/trunk/src/Layout/DynamicPatternLayout.cs (added)
+++ logging/log4net/trunk/src/Layout/DynamicPatternLayout.cs Tue Dec  6 15:46:53 2011
@@ -0,0 +1,143 @@
+#region Apache License
+//
+// 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.
+//
+#endregion
+
+
+using System;
+using System.Collections;
+using System.IO;
+
+using log4net.Core;
+using log4net.Layout.Pattern;
+using log4net.Util;
+
+namespace log4net.Layout
+{
+	/// <summary>
+	/// A flexible layout configurable with pattern string that re-evaluates on each call.
+	/// </summary>
+	/// <remarks>
+	/// <para>This class is built on <see cref="PatternLayout"></see> and provides all the
+	/// features and capabilities of PatternLayout.  PatternLayout is a 'static' class
+	/// in that its layout is done once at configuration time.  This class will recreate
+	/// the layout on each reference.</para>
+	/// <para>One important difference between PatternLayout and DynamicPatternLayout is the
+	/// treatment of the Header and Footer parameters in the configuration.  The Header and Footer
+	/// parameters for DynamicPatternLayout must be syntactically in the form of a PatternString,
+	/// but should not be marked as type log4net.Util.PatternString.  Doing so causes the
+	/// pattern to be statically converted at configuration time and causes DynamicPatternLayout
+	/// to perform the same as PatternLayout.</para>
+	/// <para>Please see <see cref="PatternLayout"/> for complete documentation.</para>
+	/// <example>
+	///	&lt;layout type="log4net.Layout.DynamicPatternLayout"&gt;
+	///   &lt;param name="Header" value="%newline**** Trace Opened     Local: %date{yyyy-MM-dd HH:mm:ss.fff}     UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /&gt;
+	///   &lt;param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /&gt;
+	/// &lt;/layout&gt;
+	/// </example>
+	/// </remarks>
+	public class DynamicPatternLayout: PatternLayout
+	{
+		#region Member Variables
+		/// <summary>
+		/// The header PatternString
+		/// </summary>
+		private PatternString m_headerPatternString = new PatternString("");
+
+		/// <summary>
+		/// The footer PatternString
+		/// </summary>
+		private PatternString m_footerPatternString  = new PatternString("");
+		#endregion
+
+		#region Constructors
+		/// <summary>
+		/// Constructs a DynamicPatternLayout using the DefaultConversionPattern
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// The default pattern just produces the application supplied message.
+		/// </para>
+		/// </remarks>
+		public DynamicPatternLayout()
+			: base()
+		{
+		}
+
+		/// <summary>
+		/// Constructs a DynamicPatternLayout using the supplied conversion pattern
+		/// </summary>
+		/// <param name="pattern">the pattern to use</param>
+		/// <remarks>
+		/// </remarks>
+		public DynamicPatternLayout (string pattern) 
+			: base(pattern)
+		{
+		}
+		#endregion
+
+		#region Override implementation of LayoutSkeleton
+		/// <summary>
+		/// The header for the layout format.
+		/// </summary>
+		/// <value>the layout header</value>
+		/// <remarks>
+		/// <para>
+		/// The Header text will be appended before any logging events
+		/// are formatted and appended.
+		/// </para>
+		/// The pattern will be formatted on each get operation.
+		/// </remarks>
+		public override string Header
+		{
+			get
+			{
+				return m_headerPatternString.Format();
+			}
+			set
+			{
+				base.Header = value;
+				m_headerPatternString = new PatternString(value);
+			}
+		}		/* property DynamicPatternLayout Header */
+
+		/// <summary>
+		/// The footer for the layout format.
+		/// </summary>
+		/// <value>the layout footer</value>
+		/// <remarks>
+		/// <para>
+		/// The Footer text will be appended after all the logging events
+		/// have been formatted and appended.
+		/// </para>
+		/// The pattern will be formatted on each get operation.
+		/// </remarks>
+		public override string Footer
+		{
+			get
+			{
+				return m_footerPatternString.Format();
+			}
+			set
+			{
+				base.Footer = value;
+				m_footerPatternString = new PatternString(value);
+			}
+		}		/* property DynamicPatternLayout Footer */
+		#endregion
+	}			/* class DynamicPatternLayout */
+}				/* namespace log4net.Layout */

Propchange: logging/log4net/trunk/src/Layout/DynamicPatternLayout.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4net/trunk/src/log4net.vs2008.csproj
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.vs2008.csproj?rev=1210987&r1=1210986&r2=1210987&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.vs2008.csproj (original)
+++ logging/log4net/trunk/src/log4net.vs2008.csproj Tue Dec  6 15:46:53 2011
@@ -365,6 +365,9 @@
     <Compile Include="ILog.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Layout\DynamicPatternLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Layout\ExceptionLayout.cs">
       <SubType>Code</SubType>
     </Compile>

Modified: logging/log4net/trunk/src/log4net.vs2010.csproj
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net.vs2010.csproj?rev=1210987&r1=1210986&r2=1210987&view=diff
==============================================================================
--- logging/log4net/trunk/src/log4net.vs2010.csproj (original)
+++ logging/log4net/trunk/src/log4net.vs2010.csproj Tue Dec  6 15:46:53 2011
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <!--
 
  Licensed to the Apache Software Foundation (ASF) under one
@@ -381,6 +381,9 @@
     <Compile Include="ILog.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Layout\DynamicPatternLayout.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Layout\ExceptionLayout.cs">
       <SubType>Code</SubType>
     </Compile>

Added: logging/log4net/trunk/tests/src/Layout/DynamicPatternLayoutTest.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Layout/DynamicPatternLayoutTest.cs?rev=1210987&view=auto
==============================================================================
--- logging/log4net/trunk/tests/src/Layout/DynamicPatternLayoutTest.cs (added)
+++ logging/log4net/trunk/tests/src/Layout/DynamicPatternLayoutTest.cs Tue Dec  6 15:46:53 2011
@@ -0,0 +1,37 @@
+#region Apache License
+//
+// 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.
+//
+#endregion
+
+using log4net.Layout;
+
+using NUnit.Framework;
+
+namespace log4net.Tests.Layout {
+    /// <summary>
+    /// Used for internal unit testing the <see cref="DynamicPatternLayout"/> class.
+    /// </summary>
+    public class DynamicPatternLayoutTest : PatternLayoutTest {
+        protected override PatternLayout NewPatternLayout() {
+            return new DynamicPatternLayout();
+        }
+
+        protected override PatternLayout NewPatternLayout(string pattern) {
+            return new DynamicPatternLayout(pattern);
+        }
+    }
+}

Propchange: logging/log4net/trunk/tests/src/Layout/DynamicPatternLayoutTest.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs?rev=1210987&r1=1210986&r2=1210987&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs (original)
+++ logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs Tue Dec  6 15:46:53 2011
@@ -47,11 +47,19 @@ namespace log4net.Tests.Layout
             Utils.RemovePropertyFromAllContexts();
         }
 
-		[Test]
+        protected virtual PatternLayout NewPatternLayout() {
+            return new PatternLayout();
+        }
+
+        protected virtual PatternLayout NewPatternLayout(string pattern) {
+            return new PatternLayout(pattern);
+        }
+
+        [Test]
 		public void TestThreadPropertiesPattern()
 		{
 			StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+            stringAppender.Layout = NewPatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
 			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 			BasicConfigurator.Configure(rep, stringAppender);
@@ -79,7 +87,7 @@ namespace log4net.Tests.Layout
         public void TestStackTracePattern()
         {
             StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%stacktrace{2}");
+            stringAppender.Layout = NewPatternLayout("%stacktrace{2}");
 
             ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
             BasicConfigurator.Configure(rep, stringAppender);
@@ -99,7 +107,7 @@ namespace log4net.Tests.Layout
 		public void TestGlobalPropertiesPattern()
 		{
 			StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+            stringAppender.Layout = NewPatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
 			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 			BasicConfigurator.Configure(rep, stringAppender);
@@ -127,7 +135,7 @@ namespace log4net.Tests.Layout
 		public void TestAddingCustomPattern()
 		{
 			StringAppender stringAppender = new StringAppender();
-			PatternLayout layout = new PatternLayout();
+			PatternLayout layout = NewPatternLayout();
 
 			layout.AddConverter("TestAddingCustomPattern", typeof(TestMessagePatternConverter));
 			layout.ConversionPattern = "%TestAddingCustomPattern";
@@ -149,7 +157,7 @@ namespace log4net.Tests.Layout
         public void NamedPatternConverterWithoutPrecisionShouldReturnFullName()
         {
             StringAppender stringAppender = new StringAppender();
-            PatternLayout layout = new PatternLayout();
+            PatternLayout layout = NewPatternLayout();
             layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
             layout.ConversionPattern = "%message-as-name";
             layout.ActivateOptions();
@@ -196,7 +204,7 @@ namespace log4net.Tests.Layout
         public void NamedPatternConverterWithPrecision1ShouldStripLeadingStuffIfPresent()
         {
             StringAppender stringAppender = new StringAppender();
-            PatternLayout layout = new PatternLayout();
+            PatternLayout layout = NewPatternLayout();
             layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
             layout.ConversionPattern = "%message-as-name{1}";
             layout.ActivateOptions();
@@ -242,7 +250,7 @@ namespace log4net.Tests.Layout
         [Test]
         public void NamedPatternConverterWithPrecision2ShouldStripLessLeadingStuffIfPresent() {
             StringAppender stringAppender = new StringAppender();
-            PatternLayout layout = new PatternLayout();
+            PatternLayout layout = NewPatternLayout();
             layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
             layout.ConversionPattern = "%message-as-name{2}";
             layout.ActivateOptions();
@@ -306,7 +314,7 @@ namespace log4net.Tests.Layout
 		public void TestExceptionPattern()
 		{
 			StringAppender stringAppender = new StringAppender();
-			PatternLayout layout = new PatternLayout("%exception{stacktrace}");
+			PatternLayout layout = NewPatternLayout("%exception{stacktrace}");
 			stringAppender.Layout = layout;
 
 			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());

Modified: logging/log4net/trunk/tests/src/log4net.Tests.vs2003.csproj
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/log4net.Tests.vs2003.csproj?rev=1210987&r1=1210986&r2=1210987&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/log4net.Tests.vs2003.csproj (original)
+++ logging/log4net/trunk/tests/src/log4net.Tests.vs2003.csproj Tue Dec  6 15:46:53 2011
@@ -227,6 +227,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "Layout\DynamicPatternLayoutTest.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "Layout\PatternLayoutTest.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: logging/log4net/trunk/tests/src/log4net.Tests.vs2008.csproj
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/log4net.Tests.vs2008.csproj?rev=1210987&r1=1210986&r2=1210987&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/log4net.Tests.vs2008.csproj (original)
+++ logging/log4net/trunk/tests/src/log4net.Tests.vs2008.csproj Tue Dec  6 15:46:53 2011
@@ -164,6 +164,9 @@
     <Compile Include="Hierarchy\Logger.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Layout\DynamicPatternLayoutTest.cs">
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="Layout\PatternLayoutTest.cs">
       <SubType>Code</SubType>
     </Compile>

Modified: logging/log4net/trunk/tests/src/log4net.Tests.vs2010.csproj
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/log4net.Tests.vs2010.csproj?rev=1210987&r1=1210986&r2=1210987&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/log4net.Tests.vs2010.csproj (original)
+++ logging/log4net/trunk/tests/src/log4net.Tests.vs2010.csproj Tue Dec  6 15:46:53 2011
@@ -181,6 +181,7 @@
     <Compile Include="Hierarchy\Logger.cs">
       <SubType>Code</SubType>
     </Compile>
+    <Compile Include="Layout\DynamicPatternLayoutTest.cs" />
     <Compile Include="Layout\PatternLayoutTest.cs">
       <SubType>Code</SubType>
     </Compile>