Author: rgrabowski
Date: Tue Nov 17 00:20:54 2009
New Revision: 881069

URL: http://svn.apache.org/viewvc?rev=881069&view=rev
Log:
Applied additional patches for LOG4NET-154 to improve functionality of 
StackTracePatternConverter.

Added:
    logging/log4net/trunk/src/Layout/Pattern/StackTraceDetailPatternConverter.cs
Modified:
    logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs
    logging/log4net/trunk/src/Layout/PatternLayout.cs
    logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs

Added: 
logging/log4net/trunk/src/Layout/Pattern/StackTraceDetailPatternConverter.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Layout/Pattern/StackTraceDetailPatternConverter.cs?rev=881069&view=auto
==============================================================================
--- 
logging/log4net/trunk/src/Layout/Pattern/StackTraceDetailPatternConverter.cs 
(added)
+++ 
logging/log4net/trunk/src/Layout/Pattern/StackTraceDetailPatternConverter.cs 
Tue Nov 17 00:20:54 2009
@@ -0,0 +1,90 @@
+using System;
+using System.Text;
+
+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(type param,...) > type2.MethodCall2(type param,...) 
> type1.MethodCall1(type param,...)
+    /// </para>
+    /// </remarks>
+    /// <author>Adam Davies</author>
+    internal class StackTraceDetailPatternConverter : 
StackTracePatternConverter
+    {
+        internal override string 
GetMethodInformation(System.Reflection.MethodBase method)
+        {
+            string returnValue="";
+
+            try
+            {
+                string param = "";
+                string[] names = GetMethodParameterNames(method);
+                StringBuilder sb = new StringBuilder();
+                if (names != null && names.GetUpperBound(0) > 0)
+                {
+                    for (int i = 0; i <= names.GetUpperBound(0); i++)
+                    {
+                        sb.AppendFormat("{0}, ", names[i]);
+                    }
+                }
+
+                if (sb.Length > 0)
+                {
+                    sb.Remove(sb.Length - 2, 2);
+                    param = sb.ToString();
+                }
+
+                returnValue=base.GetMethodInformation(method) + "(" + param + 
")";
+            }
+            catch (Exception ex)
+            {
+                LogLog.Error(declaringType, "An exception ocurred while 
retreiving method information.", ex);
+            }
+
+            return returnValue;
+        }
+
+        private string[] GetMethodParameterNames(System.Reflection.MethodBase 
methodBase)
+        {
+            string[] returnValue = null;
+            try
+            {
+                System.Reflection.ParameterInfo[] methodBaseGetParameters = 
methodBase.GetParameters();
+                
+                int methodBaseGetParametersCount = 
methodBaseGetParameters.GetUpperBound(0);
+                Array.Resize(ref returnValue, methodBaseGetParametersCount + 
1);
+
+                for (int i = 0; i <= methodBaseGetParametersCount; i++)
+                {
+                    returnValue[i] = methodBaseGetParameters[i].ParameterType 
+ " " + methodBaseGetParameters[i].Name;
+                }
+            }
+            catch (Exception ex)
+            {
+                LogLog.Error(declaringType, "An exception ocurred while 
retreiving method parameters.", ex);
+            }
+
+            return returnValue;
+        }
+
+        #region Private Static Fields
+
+        /// <summary>
+        /// The fully qualified type of the StackTraceDetailPatternConverter 
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
+    }
+}

Modified: logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs?rev=881069&r1=881068&r2=881069&view=diff
==============================================================================
--- logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs 
(original)
+++ logging/log4net/trunk/src/Layout/Pattern/StackTracePatternConverter.cs Tue 
Nov 17 00:20:54 2009
@@ -18,8 +18,6 @@
 #endregion
 
 using System;
-using System.Globalization;
-using System.Text;
 using System.IO;
 using System.Diagnostics;
 
@@ -38,7 +36,7 @@
        /// </para>
        /// </remarks>
        /// <author>Michael Cromwell</author>
-       internal sealed class StackTracePatternConverter : 
PatternLayoutConverter, IOptionHandler
+       internal class StackTracePatternConverter : PatternLayoutConverter, 
IOptionHandler
        {
                private int m_stackFrameLevel = 1;
                
@@ -114,14 +112,26 @@
                                }
                                
                                StackFrame stackFrame = 
stackframes[stackFrameIndex];
-                               writer.Write("{0}.{1}", 
stackFrame.GetMethod().DeclaringType.Name, stackFrame.GetMethod().Name);
+                writer.Write("{0}.{1}", 
stackFrame.GetMethod().DeclaringType.Name, 
GetMethodInformation(stackFrame.GetMethod()));
                                if (stackFrameIndex > 0)
                                {
+                    // TODO: make this user settable?
                                        writer.Write(" > ");
                                }
                                stackFrameIndex--;
                        }
                }
+
+                /// <summary>
+        /// Returns the Name of the method
+        /// </summary>
+        /// <param name="method"></param>
+        /// <remarks>This method was created, so this class could be used as a 
base class for StackTraceDetailPatternConverter</remarks>
+        /// <returns>string</returns>
+        internal virtual string 
GetMethodInformation(System.Reflection.MethodBase method)
+        {
+            return method.Name;
+        }
                
                #region Private Static Fields
 

Modified: logging/log4net/trunk/src/Layout/PatternLayout.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/src/Layout/PatternLayout.cs?rev=881069&r1=881068&r2=881069&view=diff
==============================================================================
--- logging/log4net/trunk/src/Layout/PatternLayout.cs (original)
+++ logging/log4net/trunk/src/Layout/PatternLayout.cs Tue Nov 17 00:20:54 2009
@@ -861,7 +861,8 @@
                        s_globalRulesRegistry.Add("timestamp", 
typeof(RelativeTimePatternConverter));
                        
                        s_globalRulesRegistry.Add("stacktrace", 
typeof(StackTracePatternConverter));
-                       
+            s_globalRulesRegistry.Add("stacktracedetail", 
typeof(StackTraceDetailPatternConverter));
+
                        s_globalRulesRegistry.Add("t", 
typeof(ThreadPatternConverter));
                        s_globalRulesRegistry.Add("thread", 
typeof(ThreadPatternConverter));
 

Modified: logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs
URL: 
http://svn.apache.org/viewvc/logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs?rev=881069&r1=881068&r2=881069&view=diff
==============================================================================
--- logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs (original)
+++ logging/log4net/trunk/tests/src/Layout/PatternLayoutTest.cs Tue Nov 17 
00:20:54 2009
@@ -69,6 +69,22 @@
                        stringAppender.Reset();
                }
 
+        [Test]
+        public void TestStackTracePattern()
+        {
+            StringAppender stringAppender = new StringAppender();
+            stringAppender.Layout = new PatternLayout("%stacktrace{2}");
+
+            ILoggerRepository rep = 
LogManager.CreateRepository(Guid.NewGuid().ToString());
+            BasicConfigurator.Configure(rep, stringAppender);
+
+            ILog log1 = LogManager.GetLogger(rep.Name, 
"TestStackTracePattern");
+
+            log1.Info("TestMessage");
+            Assert.AreEqual("RuntimeMethodHandle._InvokeMethodFast > 
PatternLayoutTest.TestStackTracePattern", stringAppender.GetString(), "stack 
trace value set");
+            stringAppender.Reset();
+        }
+
                [Test]
                public void TestGlobalPropertiesPattern()
                {


Reply via email to