代码之家  ›  专栏  ›  技术社区  ›  DaveG

如何获取当前方法调用跟踪?包括文件路径和代码行号

  •  2
  • DaveG  · 技术社区  · 6 年前

    如果我使用此代码:

    static void Main()
    {
        A();
    }
    static void A()
    {
        B();
    }
    static void B()
    {
        C();
    }
    static void C()
    {
        System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
        Console.WriteLine(t);
    }
    

    我可以得到这个:

    at test.MyClass.C()
    at test.MyClass.B()
    at test.MyClass.A()
    at test.MyClass.Main()
    

    但是如果我想要更多这样的信息,我该怎么做: 在

    test.MyClass.C()  at Program.cs line 26
    at test.MyClass.B()  at Program.cs line 22
    at test.MyClass.A()  at Program.cs line 18
    at test.MyClass.Main()  at Program.cs line 12
    

    看起来我的帖子大多是代码,所以我需要在这里输入更多的单词…

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jeremy Thompson    6 年前

    您可以使用一些特殊的(而不是众所周知的)调用者信息属性参数,例如,我在log4net实现周围有一个包装器来获取源行号:

    //I enhance the Log4Net logging by capturing the caller's name and the line of code number
    public static void Error(Type source, object message, Exception e = null, [CallerMemberName] string memberName = "",
     [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0)
    {
        ILog logger = getLogger(source);
        if (!logger.IsErrorEnabled) return;
    
        if (e == null)
            logger.Error(string.Format("MemberName: {0}, SourceLineNumber of {1}, Message: {2}", memberName, sourceLineNumber, message));
        else
            logger.Error(string.Format("MemberName: {0}, SourceLineNumber of {1}, Message: {2}", memberName, sourceLineNumber, message), e);
    
    }
    

    可选参数上的这些属性允许我们获取成员名称、文件路径和源行号:

    [CallerMemberName] string memberName = "",  
    [CallerFilePath] string sourceFilePath = "",  
    [CallerLineNumber] int sourceLineNumber = 0
    

    日志文件输出:

    错误xyz.tools.emailing.email-membername:sendmail, sourcelinenumber of 129,message:通过Exchange发送电子邮件失败 服务器。

        2
  •  2
  •   Hameed Syed    6 年前

    是的。通过使用caller-info属性,可以获取有关方法调用方的信息以及所有相关的调试信息msdn链接 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/caller-information .

    public void TraceMessage(string message,  
            [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",  
            [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",  
            [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)  
    {  
        System.Diagnostics.Trace.WriteLine("message: " + message);  
        System.Diagnostics.Trace.WriteLine("member name: " + memberName);  
        System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);  
        System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);  
    }  
    

    否则,如果可以使用外部库跟踪和记录每个信息,则可以使用 http://logging.apache.org/log4net/,the 文档也足够好。