Asp.net NET跟踪变量

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

我正在为公司的VB.NET项目研究跟踪日志记录的方法。NET框架具有相当多的跟踪功能,我想使用.NET已经提供的功能。我的公司想远离第三方软件,所以log4net和诸如此类的东西是不可能的

他们希望能够跟踪web应用程序的流,使用跟踪源、侦听器和开关将使这部分变得非常简单。但是,他们希望我在整个程序中跟踪变量的变化,而不必在计算中每隔一行写入trace.write(“i=“&i”)

那么,有什么有效的方法可以做到这一点吗

谢谢你的回答。提前谢谢


我决定去上课。我只是创建了一个具有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