记录错误的最佳做法是什么?

问题描述 投票:17回答:8

很多次我看到记录这样的错误:

System.out.println("Method aMethod with parameters a:"+a+" b: "+b);
print("Error in line 88");

那么..记录错误的最佳做法是什么?

编辑:

这是java但可能是C / C ++,基本等。

language-agnostic logging error-handling
8个回答
24
投票

直接登录到控制台是可怕的,坦率地说,是没有经验的开发人员的标志。 做这种事情的唯一原因是1)他或她不知道其他方法,和/或2)开发人员没有想到将他/她的代码部署到生产站点时会发生什么,以及如何在该点维护应用程序。 处理记录1GB /天或更多完全不需要的调试日志记录的应用程序是令人抓狂的。

普遍接受的最佳做法是使用具有以下概念的Logging框架:

  1. 不同的日志对象 - 不同的类/模块/等可以记录到不同的记录器,因此您可以选择将不同的日志配置应用于应用程序的不同部分。
  2. 不同的日志级别 - 因此您可以调整日志记录配置以仅记录生产中的错误,在开发环境中记录各种调试和跟踪信息等。
  3. 不同的日志输出-框架应允许您配置日志输出,而不需要在代码库中的任何改变发送到。 您可能希望将日志输出发送到的不同位置的一些示例是文件,基于日期/大小滚动的文件,数据库,电子邮件,远程接收器等。
  4. 日志框架应该永远永远 永远遥,从日志代码的任何异常或错误。 您的应用程序应该无法加载或无法启动,因为日志框架无法创建它的日志文件或获取文件锁定(除非这是一个关键要求,可能出于法律原因,对您的应用程序)。

您将使用的最终日志框架当然取决于您的平台。 一些常见的选择:


9
投票

Apache Commons Logging不适用于应用程序常规日志记录。 它旨在供不希望强制API用户使用日志记录的库或API使用。

Commons Logging也存在类加载问题。

选择[很多]日志API中的一个,最广泛使用的可能是log4jJava Logging API

如果您希望实现独立性,您可能需要考虑log4j的原作者SLF4J

说完拿起一个实现,然后用一贯认为执行中的日志记录级别/严重性,从而使搜索/过滤日志更容易。


2
投票

以一致格式记录错误的最简单方法是使用Log4j等日志框架(假设您使用的是Java)。 在代码标准中包含一个日志记录部分非常有用,以确保所有开发人员都知道需要记录的内容。 大多数日志记录框架的好处是它们具有不同的日志记录级别,因此您可以控制开发,测试和生产之间日志记录的详细程度。


2
投票

最佳实践是使用java.util.logging框架

然后,您可以使用以下任一格式记录消息

log.warning("..");
log.fine("..");
log.finer("..");
log.finest("..");

要么

log.log(Level.WARNING, "blah blah blah", e);

然后你可以使用logging.properties(下面的例子)在日志记录级别之间切换,并做各种聪明的事情,如记录到文件,旋转等。

handlers = java.util.logging.ConsoleHandler

.level = WARNING

java.util.logging.ConsoleHandler.level = ALL

com.example.blah = FINE
com.example.testcomponents = FINEST

在我看来,应该避免像log4j这样的框架,Java已经拥有了你需要的一切。

编辑

这可以作为任何编程语言的一般实践。 能够从单个属性文件控制所有级别的日志记录在企业应用程序中通常非常重要。


2
投票

一些建议的最佳做法

  • 使用日志框架。 这将允许您:

    • 轻松更改日志消息的目标
    • 根据严重性过滤日志消息
    • 支持国际化日志消息
  • 如果您使用的是java,则slf4j现在更喜欢将Jakarta commons记录为日志记录外观。

  • 如上所述,slf4j是一个外观,然后你必须选择一个底层实现。 log4j,java.util.logging或'simple'。

  • 遵循框架的建议,确保不必要地进行昂贵的日志记录操作


0
投票

记录错误确实没有最佳实践。 它基本上只需要遵循一致的模式(在软件/公司/等内),提供足够的信息来跟踪问题。 例如,您可能希望跟踪时间,方法,参数,调用方法等。

只要你不打印“错误”


0
投票

如上所述的apache通用日志记录API是一个很好的资源。 回头参考java,还有一个标准的错误输出流(System.err)。

直接来自Java API:

此流已打开并准备接受输出数据。

通常,该流对应于主机环境或用户指定的显示输出或另一输出目的地。 按照惯例,此输出流用于显示应立即引起用户注意的错误消息或其他信息,即使主要输出流(变量out的值)已重定向到文件或其他目标,即通常不会持续监控。


0
投票

除了来自其他答案的技术考虑因素之外,建议记录有意义的消息以及可能的一些步骤以避免将来出现错误。 当然,这取决于错误。

当消息指出“无法从文件X读取,您没有相应的权限”时,您可以从I / O错误中获得更多信息

SO上查看更多示例或在网上搜索

© www.soinside.com 2019 - 2024. All rights reserved.