Asp.net NET跟踪变量
我正在为公司的VB.NET项目研究跟踪日志记录的方法。NET框架具有相当多的跟踪功能,我想使用.NET已经提供的功能。我的公司想远离第三方软件,所以log4net和诸如此类的东西是不可能的 他们希望能够跟踪web应用程序的流,使用跟踪源、侦听器和开关将使这部分变得非常简单。但是,他们希望我在整个程序中跟踪变量的变化,而不必在计算中每隔一行写入trace.write(“i=“&i”) 那么,有什么有效的方法可以做到这一点吗 谢谢你的回答。提前谢谢Asp.net NET跟踪变量,asp.net,vb.net,logging,trace,Asp.net,Vb.net,Logging,Trace,我正在为公司的VB.NET项目研究跟踪日志记录的方法。NET框架具有相当多的跟踪功能,我想使用.NET已经提供的功能。我的公司想远离第三方软件,所以log4net和诸如此类的东西是不可能的 他们希望能够跟踪web应用程序的流,使用跟踪源、侦听器和开关将使这部分变得非常简单。但是,他们希望我在整个程序中跟踪变量的变化,而不必在计算中每隔一行写入trace.write(“i=“&i”) 那么,有什么有效的方法可以做到这一点吗 谢谢你的回答。提前谢谢 我决定去上课。我只是创建了一个具有Integer
我决定去上课。我只是创建了一个具有IntegerChanged事件的TraceVariable类。这样,代码其他部分的开发人员将能够控制如何处理变量更改,如果他不想跟踪它的话 代码如下:
Public Class TraceVariable
Private mInteger As Integer
Public Event IntegerChanged(ByVal mInteger As Integer)
Public Property TraceInteger() As Integer
Get
TraceInteger = mInteger
End Get
Set(ByVal value As Integer)
mInteger = value
RaiseEvent IntegerChanged(mInteger)
End Set
End Property
End Class
谢谢你的回答!至于这是混乱的,我们只将它用于关键变量,所以不用担心。在我们的情况下,跟踪是一种必要且安全的预防措施。如果您讨论的是int、double等基本变量,那么这将很困难,但是如果您需要跟踪对自定义类的访问,那么您所需要做的就是在属性设置器和修改状态(mutators)的方法中放置一些跟踪语句
现在,对于基本类型,您可以尝试使用某种AOP工具(如postsharp)修补这些基本类型的IL代码(变体),以发出与用户定义类相同的跟踪消息。变量更改时的跟踪看起来非常极端。。。可能会很慢
我不知道框架中有什么东西可以做到这一点。本质上,它更接近于分析或调试,而不是跟踪 跟踪每个变量的变化会很快变得混乱,并导致除最琐碎的应用程序外的任何应用程序的信息过载
如果有特定的变量要跟踪其中的更改,请将它们包装在一个简单的自滚式可跟踪类中,该类具有在执行更新时写入跟踪的访问器。您可能需要尝试以下操作(警告=>C#): 我已经对它进行了测试,但它并没有给我与c#相同的结果,糟糕的vb 希望这有帮助
class Program
{
static void Main(string[] args)
{
test(1, "one");
test(2, "two");
test(3, "three");
Console.ReadLine();
}
private static void test(int x, string y)
{
DisplayParameterNameAndValue(() => x);
DisplayParameterNameAndValue(() => y);
}
static void DisplayParameterNameAndValue(Expression<Func<object>> parameter)
{
var expressionBody = parameter.Body;
MemberExpression memberExpression;
if (expressionBody is UnaryExpression)
{
memberExpression = (MemberExpression)((UnaryExpression)expressionBody).Operand;
}
else if (expressionBody is MemberExpression)
{
memberExpression = (MemberExpression)expressionBody;
}
else
{
throw new ArgumentException("parameter");
}
string parameterName = memberExpression.Member.Name;
object parameterValue = parameter.Compile().Invoke();
Console.WriteLine("{0} => {1}", parameterName, parameterValue);
}
}
Module Module1
Sub Main()
test(1, "one")
test(2, "two")
test(3, "three")
Console.ReadLine()
End Sub
Private Sub test(ByVal x As Integer, ByVal y As String)
DisplayParameterNameAndValue(Function() x)
DisplayParameterNameAndValue(Function() y)
End Sub
Private Sub DisplayParameterNameAndValue(ByVal parameter As Expression(Of Func(Of Object)))
Dim expressionBody = parameter.Body
Dim memberExpression As MemberExpression
If TypeOf expressionBody Is UnaryExpression Then
memberExpression = DirectCast(DirectCast(expressionBody, UnaryExpression).Operand, MemberExpression)
ElseIf TypeOf expressionBody Is MemberExpression Then
memberExpression = DirectCast(expressionBody, MemberExpression)
Else
Throw New ArgumentException("parameter")
End If
Dim parameterName As String = memberExpression.Member.Name
Dim parameterValue As Object = parameter.Compile().Invoke()
Console.WriteLine("{0} => {1}", parameterName, parameterValue)
End Sub
End Module