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