记录,何时和什么?

时间:2008-10-11 16:43:17

标签: logging error-logging

我目前正在开发一个将在海外部署的大型多层应用程序。虽然我希望它一旦解复就不会摔倒或炸毁,但我不能100%肯定这一点。因此,很高兴知道我可以请求日志文件,以确切地解决出错的原因和原因。

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

6 个答案:

答案 0 :(得分:6)

1 - 使用标准格式制作单个日志。无论多么重要,但确保入口具有相同的基本字段。只是调用“printf”可能不会削减它(替换System.err.println或其他适当的东西)

2 - 允许至少一个字段为任意字符串......开发人员会比你更了解需要的字段。

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

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

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

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

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

我发现最困难的部分是错误不一定是错误。如果您使用文件调用函数,并且该文件不存在,那么该错误是否应该记录?有时它是一个严重的失败,有时它是预期的。这几乎取决于函数的API;如果函数有办法返回错误,我通常会在没有记录的情况下执行此操作;然后,更高级代码的工作是决定是否需要报告该错误或是否是预期错误。

答案 1 :(得分:6)

首先,抓住自己的日志框架 - 你没有提到任何特定的语言,但任何基于Apache log4j的框架都是一个安全的选择。最重要的是框架支持不同级别的详细程度(调试消息,警告,错误消息)。您可以在运行时配置记录器,以确定它将实际写入哪些消息,以及在哪里 - 没有必要重新发明轮子以使用日志记录。

在源代码中实现日志记录框架。至少,您应该寻找记录,然后“添加值”到您的应用程序中可能发生的异常。将堆栈跟踪写入日志文件一切都很好,但是很少能够诊断问题 - 考虑在catch {}中记录方法参数的值等。

在更高级别,您可以利用不同级别的详细程度来记录应用程序中发生的情况。如果错误仅发生在无法连接远程调试器的生产系统上,则此功能特别有用 - 您可以在日志框架配置文件中增加详细程度,并观察所有调试(“使用参数调用方法X” Y“)消息显示在日志中。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

只要您不必为性能付出太多代价,记录就很重要。

根据我的经验,您要记录的最重要的事情是那些警告,哎呀,健全检查失败,下雨天情景等等,人们在编码阳光明媚的场景时往往会忽略,有时会放弃它们关闭打印“我们不应该到达这里”等等。这些事情在测试期间不会出现,但在部署期间开始弹出,当然不会被捕获。

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

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

最后,如果您的用户运行Mac OS X,请务必小心记录错误:由于某些奇怪的原因,即使在Leopard中,默认的日志记录机制也会得到昂贵的处理并且会占用大量的CPU。

答案 4 :(得分:0)

我们开发了一个在世界各地使用的大型基于电话的系统,并且多年来一直使用我们自己的测井系统进行应用。调试级别非常重要,我们的应用程序附带调试设置为“仅错误”,除了最时间敏感之外,所有应用程序都启用了日志到文件。我们还支持将输出转移到调试跟踪系统(这是Windows,因此它是对OutputDebugString的简单调用,我们的工程师可以访问名为DBWIN32的调试捕获器)。这很重要,因为某些类别的错误要求您能够查看多个应用程序的输出,并将其序列化。我通过应用这种技术解决了一些非常棘手的多应用程序交互错误。应用程序通常会在输出中添加一个人类可读的标记,以便我们可以确定哪个行来自哪个应用程序。

我们使用的级别通常是:关闭,仅错误,基本,详细,“详细”(其中详细是占位符,表示多种内容,如投票结果,用户操作,消息内容等 - 无论作者认为什么是重要的)。

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

答案 5 :(得分:0)

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

如何执行此操作的具体细节显然取决于您的目标语言和平台(您未指定)。有关如何将此类记录器添加到基于Java Spring的应用程序的示例,请参阅here