17

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

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

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

编辑:

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

4

8 回答 8

25

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

普遍接受的最佳实践是使用具有以下概念的日志记录框架:

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

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

于 2008-11-17T17:14:52.667 回答
9

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

Commons Logging 也存在类加载问题。

选择 [许多] 日志记录 API 之一,使用最广泛的可能是log4jJava Logging API

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

选择了一个实现,然后一致地使用该实现中的日志记录级别/严重性,以便更容易搜索/过滤日志。

于 2008-11-17T17:10:41.597 回答
2

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

于 2008-11-17T17:08:01.010 回答
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 已经拥有你需要的一切。

编辑

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

于 2008-11-17T17:08:54.893 回答
2

一些建议的最佳实践

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

    • 轻松更改日志消息的目的地
    • 根据严重性过滤日志消息
    • 支持国际化的日志消息
  • 如果您使用的是 java,那么slf4j现在比Jakarta commons logging作为日志外观更受欢迎。

  • 如前所述 slf4j 是一个门面,然后您必须选择一个底层实现。log4j、java.util.logging 或“简单”。

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

于 2008-11-17T17:08:59.887 回答
0

上面提到的 apache 通用日志 API 是一个很好的资源。回到java,还有一个标准错误输出流(System.err)。

直接来自 Java API:

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

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

于 2008-11-17T17:11:09.023 回答
0

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

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

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

于 2011-02-03T14:50:58.257 回答
-1

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

只要你不只是打印“错误”

于 2008-11-17T16:59:37.143 回答