如何获取当前方法调用跟踪?包括文件路径和代码行号
How to get current method call trace? including Filepaths and Code Line Numbers
如果我使用此代码:
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
看来我的 post 主要是代码;所以我需要在这里输入更多的单词...
您可以使用一些特殊的(且不为人知的)调用者信息属性参数,例如,我有一个围绕我的 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
日志文件输出:
ERROR XYZ.Tools.Emailing.Email - MemberName: SendEmail,
SourceLineNumber of 129, Message: Sending email failed via Exchange
server.
Yes.You可以通过Caller Info属性,获取某个方法的调用者信息和所有相关的调试信息msdn link 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 文档也足够了。
如果我使用此代码:
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
看来我的 post 主要是代码;所以我需要在这里输入更多的单词...
您可以使用一些特殊的(且不为人知的)调用者信息属性参数,例如,我有一个围绕我的 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
日志文件输出:
ERROR XYZ.Tools.Emailing.Email - MemberName: SendEmail, SourceLineNumber of 129, Message: Sending email failed via Exchange server.
Yes.You可以通过Caller Info属性,获取某个方法的调用者信息和所有相关的调试信息msdn link 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 文档也足够了。