我正在研究一种跟踪公司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
感谢您的回答!至于这个混乱,我们只会将它用于关键变量,所以不用担心。在我们的情况下追踪是必要的和安全的预防措施。
答案 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!
希望这有帮助。