我正在使用System.Diagnostics中的跟踪功能,并遇到了各种问题。我已经在我的应用程序中实现了跟踪,没有任何问题,但我正在努力解决一些最佳实践。或者更简单地说,我理解如何,但不是为什么。
我有一个RESTful客户端/服务器应用程序,其中客户端是Web浏览器,服务器不在其他地方进行任何调用(例如,没有WCF调用其他服务器进程)。
我正在努力做到的概念是一个活动的概念。跟踪在概念上组合在一起,允许您查看特定活动的所有跟踪消息。在单页加载期间,我将对各种类进行多次调用,从数据库中获取数据,对数据执行业务逻辑等。
活动的粒度应该是多少? “页面加载是单个活动”还是“每个方法调用是一个新的子活动”的极端情况?或者是中间的东西,可能是:'数据访问调用,页面加载时的业务逻辑调用都是子活动,而其他所有内容都在主页加载活动'下?
另一个概念是CorrelationManager.StartLogicalOperation
方法的概念。同样,实现这一点并不棘手,但理解使用它的原因是。这似乎允许您在logicalOperation名称下将一组跟踪组合在一起。然而,这里似乎与跟踪活动组的概念有重叠。这两个概念应该一起使用吗?为什么/在什么情况下你会使用一个而不是另一个?
答案 0 :(得分:0)
我认为这些概念(Activity和LogicalOperation)是正交的。您可以拥有一个内部有许多LogicalOperations的Activity。或者,您可以使用LogicalOperation,其中Activity可以更改。我猜这个活动的级别比LogicalOperation更高。
这样说可能对我没有多大帮助,但是在你组织日志记录的过程中,由你决定对你和你的应用程序最有意义的事情。
我怀疑在单个Activity中有一个请求结果是很常见的。
您可能会发现使用帮助程序类可以更轻松地管理Activity和LogicalOperation。像这样:
class ActivityScope : IDisposable
{
Guid oldActivity;
ActivityScope()
{
oldActivity = System.Diagnostics.CorrelationManager.ActivityId;
System.Diagnostics.CorrelationManager.ActivityId = Guid.NewGuid();
}
public void Dispose()
{
System.Diagnostics.CorrelationManager.ActivityId = oldActivity;
}
}
class LogicalOperationScope : IDisposable
{
public LogicalOperationScope(string logicalOperation)
{
System.Diagnostics.CorrelationManager.StartLogicalOperation(logicalOperation);
}
public void Dispose()
{
System.Diagnostics.CorrelationManager.StopLogicalOperation();
}
}
您可以像这样使用它们:
void ServiceARequest()
{
using (new ActivityScope())
{
//Do some stuff
using (new LogicalOperationScope("SomeWork"))
{
DoSomeWork();
for (int i = 0; i < 10; i++)
{
using (new LogicalOperationScope(string.Format("nested {0}", i))
{
DoNestedWork(i);
}
}
}
}
}
void DoSomeWork()
{
using (new LogicalOperationScope("DoSomeWork"))
{
}
}
void DoNestedWork(int level)
{
}
显然,我的例子很重视诊断代码和实际代码,但你明白了。如果您有一个ActivityId或LogicalOperation是有意义的,请尝试使用与此类似的“范围”类来管理它们。
祝你好运!