VB.NET跟踪变量

时间:2009-02-09 18:50:07

标签: asp.net vb.net logging trace

我正在研究一种跟踪公司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

感谢您的回答!至于这个混乱,我们只会将它用于关键变量,所以不用担心。在我们的情况下追踪是必要的和安全的预防措施。

4 个答案:

答案 0 :(得分:2)

跟踪每个变量都会很快变得混乱,导致除了最微不足道的应用程序之外的任何信息超载。

如果要跟踪更改中存在特定变量,请将它们包装在一个简单的自动滚动Traceable类中,该类包含在执行更新时写入Trace的访问器。

答案 1 :(得分:0)

如果你正在讨论像int,double等原始变量那么这将是艰难的,但如果你需要跟踪对自定义类的访问,那么你需要做的就是在你的属性设置器和方法中放置一些trace语句修改状态(mutators)。

现在,对于原始类型,我尝试使用某种AOP工具(如postsharp)来修补这些原始类型的IL代码(mutators),以发出与用户定义的类相同的跟踪消息。 / p>

答案 2 :(得分:0)

变量变化时的追踪似乎非常极端......它可能会变慢。

我不知道框架内置了什么内容。从本质上讲,它更接近分析或调试而不是跟踪。

答案 3 :(得分:0)

您可能需要尝试以下操作(警告=> C#):

    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);
    }
}

VB中的等效代码是:

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

我测试了它,但是它没有给我与c#相同的结果,坏的vb!

希望这有帮助。