[prev in list] [next in list] [prev in thread] [next in thread] 

List:       log4net-dev
Subject:    svn commit: r778271 -
From:       rgrabowski () apache ! org
Date:       2009-05-25 3:46:45
Message-ID: 20090525034645.DEF402388874 () eris ! apache ! org
[Download RAW message or body]

Author: rgrabowski
Date: Mon May 25 03:46:44 2009
New Revision: 778271

URL: http://svn.apache.org/viewvc?rev=778271&view=rev
Log:
Fix for LOG4NET-154. Added StackTracePatternConverter that outputs the methods called \
before the log message.

Added:
    logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs

Added: logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs
URL: http://svn.apache.org/viewvc/logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs?rev=778271&view=auto
 ==============================================================================
--- logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs (added)
+++ logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs Mon May 25 \
03:46:44 2009 @@ -0,0 +1,139 @@
+#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.Globalization;
+using System.Text;
+using System.IO;
+using System.Diagnostics;
+
+using log4net.Util;
+using log4net.Core;
+
+namespace log4net.Layout.Pattern
+{
+	/// <summary>
+	/// Write the caller stack frames to the output
+	/// </summary>
+	/// <remarks>
+	/// <para>
+	/// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer, using \
format: +	/// type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1
+	/// </para>
+	/// </remarks>
+	/// <author>Michael Cromwell</author>
+	internal sealed class StackTracePatternConverter : PatternLayoutConverter, \
IOptionHandler +	{
+		private int m_stackFrameLevel = 1;
+		
+		/// <summary>
+		/// Initialize the converter
+		/// </summary>
+		/// <remarks>
+		/// <para>
+		/// This is part of the <see cref="IOptionHandler"/> delayed object
+		/// activation scheme. The <see cref="ActivateOptions"/> method must 
+		/// be called on this object after the configuration properties have
+		/// been set. Until <see cref="ActivateOptions"/> is called this
+		/// object is in an undefined state and must not be used. 
+		/// </para>
+		/// <para>
+		/// If any of the configuration properties are modified then 
+		/// <see cref="ActivateOptions"/> must be called again.
+		/// </para>
+		/// </remarks>
+		public void ActivateOptions()
+		{
+			if (Option == null)
+				return;
+			
+			string optStr = Option.Trim();
+			if (!string.IsNullOrEmpty(optStr))
+			{
+				int stackLevelVal;
+				if (SystemInfo.TryParse(optStr, out stackLevelVal))
+				{
+					if (stackLevelVal <= 0) 
+					{
+						LogLog.Error(declaringType, "StackTracePatternConverter: StackeFrameLevel \
option (" + optStr + ") isn't a positive integer."); +					}
+					else
+					{
+						m_stackFrameLevel = stackLevelVal;
+					}
+				} 
+				else
+				{
+					LogLog.Error(declaringType, "StackTracePatternConverter: StackFrameLevel option \
\"" + optStr + "\" not a decimal integer."); +				}
+			}
+		}
+		
+		/// <summary>
+		/// Write the strack frames to the output
+		/// </summary>
+		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted \
result.</param> +		/// <param name="loggingEvent">the event being logged</param>
+		/// <remarks>
+		/// <para>
+		/// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer.
+		/// </para>
+		/// </remarks>
+		override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
+		{
+			StackFrame[] stackframes = loggingEvent.LocationInformation.StackFrames;
+			if ((stackframes == null) || (stackframes.Length <= 0))
+			{
+				LogLog.Error(declaringType, "loggingEvent.LocationInformation.StackFrames was \
null or empty."); +				return;
+			}
+			
+			int stackFrameIndex = m_stackFrameLevel - 1;
+			while (stackFrameIndex >= 0)
+			{
+				if (stackFrameIndex > stackframes.Length)
+				{
+					stackFrameIndex--;
+					continue;
+				}
+				
+				StackFrame stackFrame = stackframes[stackFrameIndex];
+				writer.Write("{0}.{1}", stackFrame.GetMethod().DeclaringType.Name, \
stackFrame.GetMethod().Name); +				if (stackFrameIndex > 0)
+				{
+					writer.Write(" > ");
+				}
+				stackFrameIndex--;
+			}
+		}
+		
+		#region Private Static Fields
+
+	    /// <summary>
+	    /// The fully qualified type of the StackTracePatternConverter class.
+	    /// </summary>
+	    /// <remarks>
+	    /// Used by the internal logger to record the Type of the
+	    /// log message.
+	    /// </remarks>
+	    private readonly static Type declaringType = \
typeof(StackTracePatternConverter); +
+	    #endregion Private Static Fields
+	}
+}


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic