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
+ }
+}