[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