it-swarm.cn

记录:为什么和什么?

我从未编写过大量使用日志记录的程序。我所做的最多就是在发生异常时捕获堆栈跟踪。

我想知道,其他人登录了多少?它取决于您正在编写哪种类型的应用程序?您发现日志真的有用吗?

40
Winston Ewert

对于这项工作,我已经完成了很多嵌入式应用程序,并使用了无价的工具。至少需要记录错误并提供足够的信息以指向代码行。接下来,将是整个应用程序中的主要功能点。诸如admin之类的东西访问了计算机。我们使用的系统可以启用更多详细的日志记录。这通常是特定于开发人员的。它可以用于在功能测试过程中帮助开发人员,也可以用于帮助诊断客户问题。

我亲自在开发的所有应用程序中使用了日志记录。它总是使人们对应用程序流程有了更好的了解。特别是在客户手中。他们从未(很少)将用例限制为您要测试的用例。

24
Jeff

我不认为这取决于应用程序的类型:日志记录在all(非平凡的)应用程序中很有用。当然,我猜想它在某些应用程序中可能比其他应用程序有用更多,但我认为它永远不会无用

特别是在发生错误的情况下,堆栈跟踪会在exact故障点告诉您程序的状态,但是关于状态错误之前。该信息对于跟踪问题可能非常有用,而日志记录可以提供有用的见解。我认为,除了最琐碎的程序之外,其他所有程序都可以从中受益。

日志记录的另一种用途可能并不对所有程序都有用,它是用于统计分析。例如,您的Web服务器通常记录每个传入的请求,然后有许多工具可以分析这些日志并生成您最繁忙时间,最流行页面的图形等。您可以使用该数据进行容量规划(“我需要更大的服务器吗?”)等等。

19
Dean Harding

执行日志记录有两个原因:

  1. 诊断
  2. 审计

诊断日志记录已经被其他人讨论过了,我不再赘述了。我只是说您应该认真考虑如果发生日志故障会发生什么?您是否足够在意通过应用程序抛出异常或以其他方式对其进行管理?这是一个“取决于”,但是可能应该跳过记录信息级别的消息。

审核日志记录是一项业务需求。审核日志记录捕获系统中的重要事件,以及管理层和法律鹰派感兴趣的事件。这是诸如谁签了字,谁进行了哪些编辑等之类的事情。作为系统管理员或开发人员对系统进行故障排除,您可能只对这些感兴趣。但是,在许多情况下,这种日志记录绝对是事务的一部分,如果无法完成,则应该使整个事务失败。

分别考虑两者对我很有帮助,不仅因为一个是“可选的”,另一个是强制性的,而且因为根据要求,我实际上可能需要分别实现它们。有时(有时)它们都是水果,但一个是苹果,另一个是橙子。通常,单个日志记录框架可以同时处理两者。

9
MIA

在大多数服务器任务中,日志记录至关重要,因为管理员通常在事情发生时不在现场,因此他必须进行事后检查。

但是,谷歌的一个人曾经告诉过我,他们的服务器进程不进行日志记录。相反,它们是“仪器”;这意味着每个进程都有钩子或端口(他没有指定机制),其他进程可以在其中钩住以询问参数和统计信息。正是那些监视过程将大量内容存储到日志中,其优点是它们获取的信息不是“打开文件”,“编写”,“获取”。他们得到诸如“打开45,453个文件”,“服务X的653个客户端”,“查询Y的平均344ms响应”之类的信息

当然,这是一种不同的方法,当我照看我的系统时,即使它们的大小小了几个数量级,我也倾向于记住这种方法。

8
Javier

我来自一个记录所有内容的winforms N层应用程序。

这不是很有用。

当然,记录异常非常好;但是当您可以将异常通过电子邮件发送给开发团队时,为什么还要将它们记录到客户端计算机上呢?

记录信息很容易变成一种瘾,其价值极少得到证明。对于可以免费登录的每种情况,最好收集目标信息并将其发送到需要的地方。

4
George Stocker

必须捕获异常信息,因为在某种程度上它可能非常有用。但是有时异常信息是不够的,特别是如果应用程序用户/客户端无法使用正确的信息报告错误。

日志记录仅限于捕获错误信息吗?

以我的情况(Web应用程序)而言,我总是记录访问哪个页面,何时单击,单击什么页面,在ip和浏览器等位置。我什至记录每次访问页面的总加载时间,这样我才能知道哪些页面运行缓慢并且需要优化。所以我可以说我尽可能地登录。

起初,我不知道它将有多重要。但显然,它在许多方面(调试以外)非常有用:

  • 了解用户的行为
  • 评估新功能的接受度
  • 区分早期采用者,骗子或潜在客户

我认为,如果我们喜欢挖掘其中的统计信息,日志记录将变得更加重要。

4
Anwar Chandra

我是一家产品在海外部署的公司的开发人员。当支持团队询问问题定义时,我唯一的诊断工具是我的日志文件和客户数据库的副本。使用数据库和开发环境,我有机会重现错误的情况,因为我将输入的数据记录到模块和相关操作中。如果我可以借助收集到的数据重现该错误,则可以通过调试进行修复。如果我没有日志文件,那么我将不得不依靠客户或支持团队对在哪种情况下会发生什么的描述(这极有可能引起误解)。

其次,日志记录使我有机会在部署的站点上检测模块的瓶颈,因为我记录了某些操作的日期和时间,然后可以查看哪个操作消耗了多少时间。

除此之外,假设我们的解决方案由6个模块组成,并且我在日志文件中看到有关数据库超时的错误日志。如果这些错误也记录在其他5个模块中,则这是与SQL Server相关的问题的可能性会更大。如果仅将其记录在我的模块中,则我的查询存在错误的可能性会更大。我认为这些都是有用的指标。

我在日志文件中看到的数据类型取决于日志级别的配置。如果这是新产品,我们将日志级别设置为“全部”以收集尽可能多的数据。但是,当我们改进产品时,我们可能更喜欢将日志级别保持在“错误”,以便仅记录错误,而不记录信息级别日志等。

2
aslisabanci

日志记录对于其他程序无法获取的信息很有用:

  • 捕获堆栈跟踪(您知道了那个)
  • 捕获应用程序崩溃时正在处理的数据。请记住,当崩溃发生时,调试器仅在存在时才提供帮助。
  • 分析信息。如果您不能在生产环境上运行探查器,则广泛的日志记录包括时间戳记可以帮助您确定时间。甚至无法分辨也可以帮助您识别它是否在程序外部(例如,垃圾回收启动)。
  • 编写程序时不期望统计信息。由于其他原因,我被要求提供一段时间内的行为图。可以使用一些grep + awk + ​​Perl ninja技巧从日志文件中提取必要的数据。

注意:您至少需要两个日志文件。

  • 一个DEBUG级别的-提供您可能想像到的所有信息(包括INFO及更高版本)。如果太多,请考虑增加一个TRACE级别。
  • 一种是INFO级别的-提供10000米的系统概览。重要的里程碑在这里。

INFO 1始终打开。需要时启用DEBUG。

编写日志记录代码,以预期您可能有一天必须调试一种情况,其中所拥有的只是日志文件,而正确执行此操作可能是被解雇与晋升之间的区别。

对于额外的里程,请所有函数调用将其参数添加到任何堆栈跟踪中,在Java

public void sendEmail(String sender, String recipient) {
try { 
...
} catch (Exception e) {
  throw new RuntimeException("sendEmail(sender="+sender+", recipient="+recipient+")");
}

这种方法从本质上增强了带有参数值的调用堆栈,并且可以使您仅使用堆栈跟踪就可以分析情况,而不必查看日志文件。

2
user1249

记录总是有用的。但是在实施时要知道,谁将要读取日志。也许是某种类型的管理员,最终用户,客户,支持团队,...

因此,不仅记录堆栈跟踪,而且记录一些非开发人员可以解释的其他信息。当您的应用程序由其他一些小组维护时,将一些唯一的错误代码写入日志也很有帮助。这可以简化支持,自动化,...

从管理员角度来看的另一点:考虑日志轮换。

1
Christian

我还建议所有非平凡的应用程序都使用多级日志记录。

由于其他人指出的原因,它是解决应用程序问题的宝贵工具。

在某些情况下,日志记录是必不可少的,例如在财务应用程序和其他需要活动日志的域中,以确保安全性,使用情况度量标准和审核。

1
ocodo

当然,这取决于您所构建的系统类型。

如果要编写独立的桌面应用程序(例如字处理器),则可能不需要任何日志记录。

如果要编写嵌入式系统,那么没有日志就无法生存。否则,当嵌入式设备死机时,您不知道为什么。每当系统涉及多个进程或多个物理计算机相互通信时,您还需要记录日志。同样,当系统挂起时,您需要知道系统的哪一部分在何时以及为什么死亡。您需要能够比较日志,以确定数据是否将其从一个过程传递到另一个过程。同样,只要系统要长时间运行而无需太多用户直接交互,就需要记录日志。

1
Dima