平常我们写了一个类,目的是让所有的项目或类来调用,此时我们写生成日志,要明确是哪个类中的那个方法来调用的,以便后面好查询,保留详细的记录。
public static LogInfo Instance(string path)
{
StackTrace trace = new StackTrace();
//获取是哪个类来调用的
type = trace.GetFrame(1).GetMethod().DeclaringType;
//获取是类中的那个方法调用的
string method = trace.GetFrame(1).GetMethod().ToString()
return Init(path);
}
看到这样就完全可以达到目的,其中最关键的是用到了StackTrace类
下面看到生成的日志
2016-08-05 13:53:35,849[9] ERROR NetLog.Form1 测试一下:随便记录一条
2016-08-05 13:53:35,853[9] ERROR NetLog.Form1 发生异常:输入字符串的格式不正确。
这时候我们就可以看到是在命名空间为NetLog下的Form1这个类调用的
如果还想看到是具体那个方法调用的了
2016-08-05 14:34:58,948[9] ERROR NetLog.Form1 [Void button1_Click(System.Object, System.EventArgs)]测试一下:随便记录一条
2016-08-05 14:35:03,266[9] ERROR NetLog.Form1 [Void button1_Click(System.Object, System.EventArgs)]发生异常:输入字符串的格式不正确。
可以看到是void button1_Click(object sender, EventArgs e)这个方法调用的
方法的返回值void
方法的名称button1_Click
方法的参数sender,e
namespace System.Diagnostics
{
// 摘要:
// 表示一个堆栈跟踪,它是一个或多个堆栈帧的有序集合。
[Serializable]
[ComVisible(true)]
public class StackTrace
{
// 摘要:
// 定义要从堆栈跟踪中省略的默认方法数。此字段为常数。
public const int METHODS_TO_SKIP = 0;
// 摘要:
// 用调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例。
public StackTrace();
//
// 摘要:
// 用调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例,可以选择捕获源信息。
//
// 参数:
// fNeedFileInfo:
// 如果为 true,则捕获文件名、行号和列号;否则为 false。
public StackTrace(bool fNeedFileInfo);
//
// 摘要:
// 使用提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例。
//
// 参数:
// e:
// 从其构造堆栈跟踪的异常对象。
//
// 异常:
// System.ArgumentNullException:
// 参数 e 为 null。
public StackTrace(Exception e);
//
// 摘要:
// 从调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例,跳过指定的帧数。
//
// 参数:
// skipFrames:
// 堆栈中的帧数,将从其上开始跟踪。
//
// 异常:
// System.ArgumentOutOfRangeException:
// skipFrames 参数为负数。
public StackTrace(int skipFrames);
//
// 摘要:
// 初始化包含单个帧的 System.Diagnostics.StackTrace 类的新实例。
//
// 参数:
// frame:
// System.Diagnostics.StackTrace 对象应包含的帧。
public StackTrace(StackFrame frame);
//
// 摘要:
// 使用所提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例,可以选择捕获源信息。
//
// 参数:
// e:
// 从其构造堆栈跟踪的异常对象。
//
// fNeedFileInfo:
// 如果为 true,则捕获文件名、行号和列号;否则为 false。
//
// 异常:
// System.ArgumentNullException:
// 参数 e 为 null。
public StackTrace(Exception e, bool fNeedFileInfo);
//
// 摘要:
// 使用提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例,并跳过指定的帧数。
//
// 参数:
// e:
// 从其构造堆栈跟踪的异常对象。
//
// skipFrames:
// 堆栈中的帧数,将从其上开始跟踪。
//
// 异常:
// System.ArgumentNullException:
// 参数 e 为 null。
//
// System.ArgumentOutOfRangeException:
// skipFrames 参数为负数。
public StackTrace(Exception e, int skipFrames);
//
// 摘要:
// 从调用方的帧初始化 System.Diagnostics.StackTrace 类的新实例,跳过指定的帧数并可以选择捕获源信息。
//
// 参数:
// skipFrames:
// 堆栈中的帧数,将从其上开始跟踪。
//
// fNeedFileInfo:
// 如果为 true,则捕获文件名、行号和列号;否则为 false。
//
// 异常:
// System.ArgumentOutOfRangeException:
// skipFrames 参数为负数。
public StackTrace(int skipFrames, bool fNeedFileInfo);
//
// 摘要:
// 初始化特定线程的 System.Diagnostics.StackTrace 类的新实例,可以选择捕获源信息。
//
// 参数:
// targetThread:
// 请求其堆栈跟踪的线程。
//
// needFileInfo:
// 如果为 true,则捕获文件名、行号和列号;否则为 false。
//
// 异常:
// System.Threading.ThreadStateException:
// targetThread 线程未暂停。
public StackTrace(Thread targetThread, bool needFileInfo);
//
// 摘要:
// 使用提供的异常对象初始化 System.Diagnostics.StackTrace 类的新实例,跳过指定的帧数并可以选择捕获源信息。
//
// 参数:
// e:
// 从其构造堆栈跟踪的异常对象。
//
// skipFrames:
// 堆栈中的帧数,将从其上开始跟踪。
//
// fNeedFileInfo:
// 如果为 true,则捕获文件名、行号和列号;否则为 false。
//
// 异常:
// System.ArgumentNullException:
// 参数 e 为 null。
//
// System.ArgumentOutOfRangeException:
// skipFrames 参数为负数。
public StackTrace(Exception e, int skipFrames, bool fNeedFileInfo);
// 摘要:
// 获取堆栈跟踪中的帧数。
//
// 返回结果:
// 堆栈跟踪中的帧数。
public virtual int FrameCount { get; }
// 摘要:
// 获取指定的堆栈帧。
//
// 参数:
// index:
// 所请求的堆栈帧的索引。
//
// 返回结果:
// 指定的堆栈帧。
public virtual StackFrame GetFrame(int index);
//
// 摘要:
// 返回当前堆栈跟踪中所有堆栈帧的副本。
//
// 返回结果:
// System.Diagnostics.StackFrame 类型的数组,表示堆栈跟踪中的函数调用。
[ComVisible(false)]
public virtual StackFrame[] GetFrames();
//
// 摘要:
// 生成堆栈跟踪的可读表示形式。
//
// 返回结果:
// 堆栈帧的可读表示形式。
public override string ToString();
}
}