2008-10-11 129 views
8

我目前正在开发一个相当大的多层应用程序,将部署在海外。虽然我希望它一旦被解体后不会崩溃或爆炸,但我不能100%确定这一点。因此,如果知道我可以请求日志文件,找出出错的原因以及原因,那就太好了。记录,什么时候和什么?

因此,基本上如标题所示,我想知道何时以及要记录什么?我想知道这一点,以确保我有全面的日志文件,可以轻松检查,以确定如果我的应用程序崩溃发生了什么。

回答

6

1 - 使用标准格式制作一个日志。这并不重要,但要确保每次进入都具有相同的基本领域。只是调用“printf”可能不会削减它(替换System.err.println或任何适当的)

2 - 允许至少一个字段是一个任意字符串...开发人员会更好地知道你有什么需要在那里。

3 - 在每个条目中包含高分辨率时间戳。你最终会需要它,相信我。

4 - 如果可能,请包含错误来源的文件和行号。这在C中很容易,而且在Java中有点痛苦。但是它很难用以后会有用,特别是当人们开始剪切+粘贴代码时,包括错误信息。

5 - 确保日志位于任何级别的代码可以使用它的地方。

6 - 我经常使用“主要”和“次要”错误标签,其中“主要”是指“我是检测到有问题的人”,而“次要”是指“我称为功能其中报告了错误“。这样可以很容易地找到问题的根源(“主要:找不到文件”),并仍然报告错误的含义(“次要:无法加载校准表”)。

7 - 包含一些记录非错误和错误的功能。

我发现最难的部分是错误不一定是错误。如果你用一个文件调用一个函数,并且该文件不存在,是否应该记录一个错误或者不是?有时候这是一个严重的失败,有时是预期的。它基本上取决于函数的API;如果该函数有办法返回一个错误,我通常会这样做,而不需要记录;那么上层代码的工作就是决定是否需要报告该错误或者是否有预期的错误。

0

只要您不必为绩效付出太多,采伐就很重要。

根据我的经验,您想要记录的最重要的事情是那些警告,糟糕的,完整性检查失败,雨天的情景等,在编写晴天情景时往往会忽略,有时会放弃他们关闭打印“我们不应该到这里”等等。这些东西有倾向于在测试期间不出现,但在部署期间开始弹出,当然他们没有被捕获。

如果您记录并打算通过远程读取结果,请确保捕获确切的时间戳,位置和某种类型的会话标识(以防多个实例同时运行并写入日志文件)。您越容易确定哪些消息是一次执行的一部分,那么您就越好。

错误级别和类型也很重要。进行搜索以确保不会从多个位置写入相同的消息或跟踪将很困难也很重要。

最后,如果您的用户运行Mac OS X,请注意记录错误:出于某种奇怪的原因,即使在Leopard中,默认日志记录机制的处理成本高昂,并且可能会浪费大量CPU。

6

首先,抓住自己的日志框架 - 你没有提到任何特定的语言,但基于Apache log4j的任何框架都是安全的。最重要的是框架支持不同级别的冗长(调试消息,警告,错误消息)。您可以在运行时对记录器进行配置,以确定哪些消息将实际写入,以及在哪里 - 重新发明轮盘以记录日志没有意义。

在你的源代码中实现你的日志框架。至少,您应该考虑记录,然后对应用程序中可能发生的异常“增值”。将堆栈跟踪写入日志文件非常好,但很少能够诊断问题 - 请考虑记录方法参数的值。

在更高层次上,您可以利用不同冗长级别的强大功能来记录应用程序中发生了什么。如果错误只发生在无法连接远程调试器的生产系统上,那么这种方法特别有用 - 您只需提高日志框架配置文件中的详细级别,并观察所有调试(“调用带参数的方法X Y“)消息出现在日志中。

1

我只想为一个大型关键任务应用程序添加一小部分,只有部署后才能调查问题,通过客户端发送的日志帮助您了解何时何地登录随着应用程序的成熟与时间的延长(成熟度直接与应用程序在一个地方部署和使用的时间量以及它[在不同的客户端/位置]上的不同部署次数)有关。

0

我们开发了一个全球范围内使用的基于电话的大型系统,并且多年来一直使用我们自己的日志记录系统。调试级别非常重要,我们的应用程序随调试设置为“仅限错误”一起提供,并且在除时间敏感以外的所有时间启用日志文件。我们还支持将输出转移到调试跟踪系统(这是Windows,所以这是对OutputDebugString的简单调用,我们的工程师可以访问调试捕获器,称为DBWIN32)。这很重要,因为某些类的错误要求您能够看到多个应用程序的输出,这些应用程序是序列化的。我已经通过应用这种技术解决了一些非常棘手的多应用程序交互错误。应用程序通常会在输出中添加一个可读的标签,以便我们可以知道哪个行来自哪个应用程序。

我们使用的级别通常是:关闭,仅错误,基本,详细,“详细”(其中verbose是一个占位符,暗示诸如轮询结果,用户操作,消息内容等多重事物 - 无论作者认为重要) 。

哦,应用程序写入其日志文件的第一件事是提供其版本资源的头文件,因此我们可以告诉我们正在处理的构建 - 不要相信用户或本地工程师知道: - )

0

AOP对于非侵入式日志记录非常有用。例如,您可以使用AOP记录每个方法调用的参数值和返回值,而不实际将日志记录语句添加到每个方法。

如何做到这一点的具体细节显然取决于你的目标语言和平台(你没有指定)。有关如何将此类记录程序添加到基于Java Spring的应用程序的示例,请参阅here

相关问题