这不是一个真正的问题,而是一篇希望能帮助其他人的答案。
那些以前编写过Windows服务的人都知道,在其中查找错误可能是一项艰巨的任务,特别是如果它只在实际环境中发生。在我的情况下,我有一个服务,在几个小时内平稳运行,然后由于堆栈溢出错误而停止。没有堆栈跟踪。祝你好运在海量日志中寻找错误原因。
该服务确实生成了一个日志文件,并且代码中有很多日志条目,但尽管如此详细,它仍会产生大小为500 MB的日志文件!您几乎无法打开该文件,更不用说分析它了。但是,如何解决这个问题?您可以尝试生成较少信息的日志文件,或者一个可以在编写新条目时自动删除旧日志条目的日志文件,但是这样做会使错误的上下文丢失。
解决方案是一个日志文件,将跟踪代码中的循环,并自动删除每个成功迭代的日志条目。这样,您可以维护一个高度详细的日志文件,同时保持相对较小的大小。当您的服务出现故障时,您的日志文件将告诉您发生了什么,以及它发生的原因和背景。
您可以从http://sourceforge.net/projects/smartl/files/?source=navbar下载这个日志文件生成器。它是一个独立的类,所有方法都是静态的。提供了一个示例类,展示了如何正确使用日志记录方法:
public void ExampleMethod()
{
SmartLog.EnterMethod("ExampleMethod()");
try
{
SmartLog.Write("Some code happening before the loop");
Guid exampleLoopID = SmartLog.RegisterLoop("exampleLoopID");
for (int i = 0; i < 10; i++)
{
SmartLog.IncrementLoop(exampleLoopID);
SmartLog.Write("Some code happening inside the loop.");
}
SmartLog.CompleteLoop(exampleLoopID);
SmartLog.Write("Some code happening after the loop.");
SmartLog.LeaveMethod("ExampleMethod()");
}
catch (Exception ex)
{
SmartLog.WriteException(ex);
SmartLog.LeaveMethod("ExampleMethod()");
throw;
}
}
确保您的应用程序在其根文件夹上具有读写权限。
如果您执行代码,并且在循环内部中断它,则日志文件将看起来像这样:
. ENTER METHOD: FirstMethod()
some code happening here.
Calling a different method:
. . ENTER METHOD: ExampleMethod()
some code happening before the loop.
LOOP: doWorkLoopID [4135a8ed-05b7-45de-b887-b2ab3c638faa] - CURRENT ITERATION: 20
some code happening inside the loop.
一旦循环完成,它的内容就会被移除,您的日志文件将如下所示:
. ENTER METHOD: FirstMethod()
some code happening here.
Calling a different method:
. . ENTER METHOD: ExampleMethod()
some code happening before the loop.
LOOP: doWorkLoopID [4135a8ed-05b7-45de-b887-b2ab3c638faa] - TOTAL ITERATIONS: 22
some code happening after the loop.
. . LEAVING METHOD: ExampleMethod()
some code happening here.
some code happening here.
. LEAVING METHOD: FirstMethod()
我希望这篇文章可以帮助别人解决那个问题,否则可能需要几周时间才能解决。对我来说,它确实很有效。