Answers:
我不认为这取决于应用程序的类型:日志记录在所有(非平凡的)应用程序中都很有用。当然,我猜想它在某些应用程序中可能比其他应用程序更有用,但是我认为它永远都没有用。
特别是在发生错误的情况下,堆栈跟踪会告诉您确切的故障点程序的状态,但是对于错误发生前的状态您几乎一无所知。该信息对于跟踪问题可能非常有用,而日志记录可以对此提供有用的见解。我认为,除了最琐碎的程序之外,其他所有程序都可以从中受益。
日志记录的另一种用途可能并不对所有程序有用,但它是用于统计分析。例如,您的Web服务器通常记录每个传入的请求,然后有许多工具可以分析这些日志并生成您最繁忙时间,最流行页面的图形等。您可以使用该数据进行容量规划(“我需要更大的服务器吗?”)等等。
执行日志记录有两个原因:
诊断日志记录已经由其他人讨论过了,我不会再为它烦恼了。我只是说您应该认真考虑如果发生日志故障会发生什么?您是否足够在意通过应用程序抛出异常或以其他方式对其进行管理?这是一个“取决于”,但是可能应该跳过记录信息级别的消息。
审核日志记录是一项业务要求。审核日志记录捕获系统中的重要事件,以及管理层和法律鹰派感兴趣的事件。这是诸如谁签了字,谁进行了哪些编辑等之类的事情。作为系统管理员或开发人员对系统进行故障排除,您可能只对这些感兴趣。但是,在许多情况下,这种日志记录绝对是事务的一部分,如果无法完成,则应该使整个事务失败。
分别考虑两者对我很有帮助,不仅因为一个是“可选的”,另一个是强制性的,而且因为根据要求,我实际上可能需要分别实现它们。有时(有时)它们都是水果,但一个是苹果,另一个是橙子。通常,单个日志记录框架可以同时处理两者。
在大多数服务器任务中,日志记录至关重要,因为管理员通常在事情发生时不在现场,因此他必须进行事后检查。
但是,谷歌的一个人曾经告诉过我,他们的服务器进程不进行日志记录。相反,它们是“仪器”;这意味着每个进程都有钩子或端口(他没有指定机制),其他进程可以在其中钩住以询问参数和统计信息。正是那些监视过程将大量内容存储到日志中,其优点是它们获取的信息不是“打开文件”,“编写”,“获取”。他们得到诸如“打开45,453个文件”,“服务X的653个客户端”,“查询Y的平均344ms响应”之类的信息
当然,这是一种不同的方法,当我照看我的系统时,即使它们的大小小了几个数量级,我也倾向于记住这种方法。
我来自一个记录所有内容的winforms N层应用程序。
这不是很有用。
当然,记录异常非常好;但是当您可以将异常通过电子邮件发送给开发团队时,为什么还要将它们记录到客户的计算机上呢?
记录信息很容易变成一种瘾,其价值极少得到证明。对于可以免费登录的每种情况,最好收集目标信息并将其发送到需要的地方。
必须捕获异常信息,因为在某种程度上它可能非常有用。但是有时异常信息是不够的,特别是如果应用程序用户/客户端无法使用正确的信息报告错误。
日志记录仅限于捕获错误信息吗?
在我的情况下(Web应用程序),我总是记录访问哪个页面,何时单击,单击什么页面,在ip和浏览器等位置。我什至记录每次访问页面的总加载时间,这样我才能知道哪些页面运行缓慢并且需要优化。所以我可以说我尽可能地登录。
起初,我不知道它将有多重要。但显然,它在许多方面(调试以外)非常有用:
我认为,如果我们喜欢挖掘其中的统计信息,日志记录将变得更加重要。
我是一家产品在海外部署的公司的开发人员。当支持团队询问问题定义时,我唯一的诊断工具是我的日志文件和客户数据库的副本。使用数据库和开发环境,我有机会重现错误的情况,因为我将输入的数据记录到模块和相关操作中。如果我可以借助收集到的数据重现该错误,则可以通过调试对其进行修复。如果我没有日志文件,那么我将不得不依靠客户或支持团队对在哪种情况下会发生什么的描述(这极有可能引起误解)。
其次,日志记录使我有机会在部署的站点上检测模块的瓶颈,因为我记录了某些操作的日期和时间,然后可以查看哪个操作消耗了多少时间。
除此之外,假设我们的解决方案由6个模块组成,并且我在日志文件中看到有关数据库超时的错误日志。如果这些错误也记录在其他5个模块中,则这是与SQL Server相关的问题的可能性会更大。如果仅将其记录在我的模块中,则我的查询存在错误的可能性会更大。我认为这些都是有用的指标。
我在日志文件中看到的数据类型取决于日志级别的配置。如果这是新产品,我们将日志级别设置为“全部”以收集尽可能多的数据。但是,当我们改进产品时,我们可能更喜欢将日志级别保持在“错误”,以便仅记录错误,而不记录信息级别日志等。
日志记录对于其他程序无法获取的信息很有用:
注意:您至少需要两个日志文件。
INFO 1始终打开。需要时启用DEBUG 1。
编写日志记录代码,以预期您可能有一天必须调试一种情况,其中您所拥有的只是日志文件,而正确执行操作可能是被解雇与晋升之间的区别。
对于额外的路程,在Java中,请所有函数调用将其参数添加到任何堆栈跟踪中
public void sendEmail(String sender, String recipient) {
try {
...
} catch (Exception e) {
throw new RuntimeException("sendEmail(sender="+sender+", recipient="+recipient+")");
}
这种方法从本质上增强了带有参数值的调用堆栈,并且可以使您仅使用堆栈跟踪就可以分析情况,而不必查看日志文件。