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

时间:2008-11-17 16:55:45

标签: language-agnostic logging error-handling

我多次看到记录这些错误:

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

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

修改

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

8 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:9)

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

Commons Logging也存在类加载问题。

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分: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已经拥有了你需要的一切。

修改

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

答案 4 :(得分:2)

一些建议的最佳做法

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

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

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

  • 按照您的框架建议,确保expensive logging operations不会被不必要地执行

答案 5 :(得分:0)

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

只要您不打印“错误”

答案 6 :(得分:0)

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

直接来自Java API:

  

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

     

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

答案 7 :(得分:0)

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

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

SOsearch the web上查看更多示例。