关于StackTrace的基础可以参见浅析StackTrace(顽强的灰太狼)。
我们在设计日志模块时通常会记录两种信息:
1)软件运行的业务数据
2)软件运行的技术参数(如当前调用的函数堆栈)。
一下通过一下方法可以获取当前调用的函数:
获取调用函数
1
private
static
string
GetCaller()
2
{
3
StackTrace stackTrace
=
new
StackTrace();
//
get call stack
4
StackFrame[] stackFrames
=
stackTrace.GetFrames();
//
get method calls (frames)
5
6
int
i
=
1
;
7
for
(; i
<
stackFrames.Length; i
++
)
8
{
9
StackFrame stackFrame
=
stackFrames[i];
10
if
(stackFrame.GetMethod()
!=
null
)
11
{
12
string
typeName
=
stackFrame.GetMethod().ReflectedType
==
null
?
stackFrame.GetMethod().Name : stackFrame.GetMethod().ReflectedType.Name;
13
string
methodName
=
stackFrame.GetMethod().Name;
14
if
(
"
LogHelper
"
.Equals(typeName)
&&
(
"
WriteMessage
"
.Equals(methodName)
||
"
WriteLog
"
.Equals(methodName)))
15
{
16
i
++
;
17
}
18
else
19
{
20
if
(stackFrames.Length
>=
i
+
1
)
21
{
22
stackFrame
=
stackFrames[i];
23
return
stackFrame.GetMethod().ReflectedType
==
null
?
stackFrame.GetMethod().Name : stackFrame.GetMethod().ReflectedType.Name
+
"
.
"
+
stackFrame.GetMethod().Name;
24
}
25
else
26
{
27
break
;
28
}
29
}
30
}
31
}
32
33
return
""
;
34
}
其中:
if ("LogHelper".Equals(typeName) && ("WriteMessage".Equals(methodName) || "WriteLog".Equals(methodName)))
是用于判断是否为当前日志模块的方法,如果是则忽略。