什么是NLOG中的UserStackFrame以及如何获取它?

时间:2015-07-13 22:30:14

标签: c# .net nlog

在我的应用程序中,我将LogEventInfo.UserStackFrame属性设为null。 所以我想设置它,但它是什么以及如何设置它?

1 个答案:

答案 0 :(得分:1)

我们需要确保它是第一个userStackFrame。见here.

using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;

using NLog.Filters;
using NLog.Targets;
using NLog.Internal;

namespace NLog
{
internal sealed class LoggerImpl
{
    private LoggerImpl() { }

    private const int STACK_TRACE_SKIP_METHODS = 0;

    private static Assembly nlogAssembly = typeof(Logger).Assembly;

    internal static void Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory)
    {
        if (targets == null)
            return;

#if !NETCF            
        bool needTrace = false;
        bool needTraceSources = false;

        int nst = targets.NeedsStackTrace;

        if (nst > 0)
            needTrace = true;
        if (nst > 1)
            needTraceSources = true;

        StackTrace stackTrace = null;
        if (needTrace && !logEvent.HasStackTrace)
        {
            int firstUserFrame = 0;
            stackTrace = new StackTrace(STACK_TRACE_SKIP_METHODS, needTraceSources);

            for (int i = 0; i < stackTrace.FrameCount; ++i)
            {
                System.Reflection.MethodBase mb = stackTrace.GetFrame(i).GetMethod();

                if (mb.DeclaringType.Assembly == nlogAssembly || mb.DeclaringType == loggerType)
                {
                    firstUserFrame = i + 1;
                }
                else
                {
                    if (firstUserFrame != 0)
                        break;
                }
            }
            logEvent.SetStackTrace(stackTrace, firstUserFrame);
        }
#endif 
        for (TargetWithFilterChain awf = targets; awf != null; awf = awf.Next)
        {
            Target app = awf.Target;
            FilterResult result = FilterResult.Neutral;

            try
            {
                FilterCollection filterChain = awf.FilterChain;

                for (int i = 0; i < filterChain.Count; ++i)
                {
                    Filter f = filterChain[i];
                    result = f.Check(logEvent);
                    if (result != FilterResult.Neutral)
                        break;
                }
                if ((result == FilterResult.Ignore) || (result == FilterResult.IgnoreFinal))
                {
                    if (InternalLogger.IsDebugEnabled)
                    {
                        InternalLogger.Debug("{0}.{1} Rejecting message because of a filter.", logEvent.LoggerName, logEvent.Level);
                    }
                    if (result == FilterResult.IgnoreFinal)
                        return;
                    continue;
                }
            }
            catch (Exception ex)
            {
                InternalLogger.Error("FilterChain exception: {0}", ex);
                if (factory.ThrowExceptions)
                    throw;
                else
                    continue;
            }

            try
            {
                app.Write(logEvent);
            }
            catch (Exception ex)
            {
                InternalLogger.Error("Target exception: {0}", ex);
                if (factory.ThrowExceptions)
                    throw;
                else
                    continue;
            }
            if (result == FilterResult.LogFinal)
                return;
        }
    }
}
}

如果您想获得最高级别的函数调用,请使用MSDN.

StackTrace st = new StackTrace();

  // Display the most recent function call.
  StackFrame sf = st.GetFrame(0);
  Console.WriteLine();
  Console.WriteLine("  Exception in method: ");
  Console.WriteLine("      {0}", sf.GetMethod());

  if (st.FrameCount >1)
  {
     // Display the highest-level function call  
     // in the trace.
     sf = st.GetFrame(st.FrameCount-1);
     Console.WriteLine("  Original function call at top of call stack):");
     Console.WriteLine("      {0}", sf.GetMethod());
  }