2008-11-17 66 views
15

很多时候,我看到了这样的错误日志记录:记录错误的最佳做法是什么?

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

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

编辑:

这是Java,但可能是C/C++,BASIC等

回答

8

的Apache共享日志记录不用于应用一般记录。它旨在被不希望强制API用户的日志实施的库或API使用。

Commons Logging也存在类加载问题。

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

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

挑选了一个实现,然后使用该实现中的日志级别/严重性一致,以便搜索/筛选日志更容易。

+0

这些通常具有高级功能,如自动记录源和按等级或起始位置过滤。这使得调试更容易。使用其中之一! (也检查链锯) – 2008-11-17 17:19:25

0

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

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

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 logging作为伐木立面。

  • 如前所述,slf4j是一个外观,你必须选择一个基础实现。 log4j,java.util.logging或'simple'。

  • 按照你的框架的建议,以确保expensive logging operations没有不必要进行

0

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

直接从Java API:

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

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

22

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

普遍接受的最佳做法是使用一个日志框架具有的概念:

  1. 不同的日志对象 - 不同的类/模块/等,可以登录到不同的记录器,这样你就可以选择应用不同的日志配置到应用程序的不同部分。
  2. 不同的日志级别 - 所以你可以调整日志配置,只记录生产中的错误,在开发环境中记录各种调试和跟踪信息等。
  3. 不同的日志输出 - 框架应该允许你配置其中日志输出发送到,而不需要对代码库进行任何更改。不同地方的一些例子,你可能想日志输出发送到是文件,在文件根据日期/大小,数据库,电子邮件,远程水槽等
  4. 日志框架不应永远从未抛出卷来自日志代码的任何异常或错误。您的应用程序不应该无法加载或无法启动,因为日志框架无法创建日志文件或获取文件上的锁定(除非这是一个关键要求,也许出于法律原因,对于您的应用程序)。

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

0
从技术考虑

除了其他的答案最好是日志有意义的消息也许还有一些步骤,以避免未来的错误。当然,这取决于错误。

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

查看更多关于SOsearch the web的例子。

相关问题