在企业级的开发过程中,我们不可避免地会碰到很多问题;如果您希望在开发过程的后期能够有效地捕捉 bug,那就需要一种有效的日志策略。但是在一个企业的应用程序中要想实现有效地记录日志,需要进行一番规划,并设计一些准则。在本文中,顾问 Charles Chan 将向您介绍一些最好的实践,从而帮助您从项目一开始就编写有用的日志代码。
如果您是一名开发人员,那您很可能就已经具有这种经验:您已经开发了一些代码以及一些测试用例。应用程序经过了严格的 QA 测试,您确信代码可以完全适合业务的需求。然而,在将应用程序最终交付终端用户的手里时,却会出现一些预想不到的问题。如果没有适当的日志消息,可能需要花费几天的时间来诊断这些问题。不幸的是,大部分项目对于日志都没有一个清晰的策略。如果没有这种策略,系统产生的日志消息就有可能无益于问题的分析和解决。在本文中,我们将讨论企业应用程序日志的各个方面的问题。您将看到一个 Java™ 平台上日志 API 的概述,学习一些最好的编写日志代码的实践,并了解如果需要在产品环境中对详细日志重新进行排序,应该如何处理。
选择日志 API
在使用 Java 平台进行开发时,可以使用两个主要的日志 API:Apache Log4J 和 Java Logging API,在 1.4 及更高版本的 Java 平台中都提供了这两个 API。与 Java Logging API 相比,Log4J 更加成熟,特性也更加丰富。这两个日志的实现都采用了一个类似的设计模式(如图 1 所示)。除非您的公司限制要使用第三方的库,否则我强烈建议使用 Log4J。如果您不能决定使用哪个 API,就可以使用 Apache Commons Logging API,它对底层的日志实现进行了封装。从理论上来说,这样不用修改代码就可以进行日志实现的切换。然而,实际上您很少会切换日志的实现;因此,我不建议使用 Apache Commons Logging API,因为它的复杂性并不没有给您带来其他特性。
日志概述
Log4J 和 Java Logging API 都采用了类似的设计和使用模式(如图 1 和清单 1 所示)。消息首先被创建,然后传递给一个具有特定优先权的日志对象。这些消息的目的和格式是由输出处理程序及其布局所决定。
清单 1. 日志对象的实例化和使用
import org.apache.log4j.Logger;
public class MyClass {
/*
* Obtain a logger for a message category. In this case, the message category is
* the fully qualified class name of MyClass.
*/
private static final Logger logger = Logger.getLogger(MyClass.class.getName());
...
public void myMethod() {
...
if (logger.isDebugEnabled()) {
logger.debug("Executing with parameters: " + param1 + ":" + param2);
}
}
}
一个好的日志实现中提供了很多不同的输出处理程序,最常见的文件输出处理程序和终端输出处理程序。Log4J 还提供了一些处理程序将消息发布到一个 JMS 主题中,或者将消息插入一个数据库表中。尽管这编写一个定制的附加器并不困难,但是编写和维护这种代码的总体成本不应低估。消息的格式可以通过 Layout 对象进行配置。最常见的 layout 对象是 PatternLayout,它根据所提供的模式对消息进行格式化。
1
2
3
4
5
6
下一页>>