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() {