这不是一个真正的问题,而是一个希望对其他人有所帮助的答案。
那些以前编写过 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()
我希望这可以帮助某人解决这个问题,否则这可能需要数周时间。它确实对我有用。