技术开发 频道

有效地记录日志可以简化企业开发过程

【IT168 技术文档】

   在企业级的开发过程中,我们不可避免地会碰到很多问题;如果您希望在开发过程的后期能够有效地捕捉 bug,那就需要一种有效的日志策略。但是在一个企业的应用程序中要想实现有效地记录日志,需要进行一番规划,并设计一些准则。在本文中,顾问 Charles Chan 将向您介绍一些最好的实践,从而帮助您从项目一开始就编写有用的日志代码。
 
  如果您是一名开发人员,那您很可能就已经具有这种经验:您已经开发了一些代码以及一些测试用例。应用程序经过了严格的 QA 测试,您确信代码可以完全适合业务的需求。然而,在将应用程序最终交付终端用户的手里时,却会出现一些预想不到的问题。如果没有适当的日志消息,可能需要花费几天的时间来诊断这些问题。不幸的是,大部分项目对于日志都没有一个清晰的策略。如果没有这种策略,系统产生的日志消息就有可能无益于问题的分析和解决。在本文中,我们将讨论企业应用程序日志的各个方面的问题。您将看到一个 Java™ 平台上日志 API 的概述,学习一些最好的编写日志代码的实践,并了解如果需要在产品环境中对详细日志重新进行排序,应该如何处理。
 
选择日志 API
 
  在使用 Java 平台进行开发时,可以使用两个主要的日志 API:Apache Log4J 和 Java Logging API,在 1.4 及更高版本的 Java 平台中都提供了这两个 API。与 Java Logging API 相比,Log4J 更加成熟,特性也更加丰富。这两个日志的实现都采用了一个类似的设计模式(如下图所示)。除非您的公司限制要使用第三方的库,否则我强烈建议使用 Log4J。如果您不能决定使用哪个 API,就可以使用 Apache Commons Logging API,它对底层的日志实现进行了封装。从理论上来说,这样不用修改代码就可以进行日志实现的切换。然而,实际上您很少会切换日志的实现;因此,我不建议使用 Apache Commons Logging API,因为它的复杂性并不没有给您带来其他特性。
 
日志概述
 
  Log4J 和 Java Logging API 都采用了类似的设计和使用模式(如下图和清单 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,它根据所提供的模式对消息进行格式化。
 
  清单 2 给出了一个 Log4J 的样例配置文件,它负责配置 FileAppender。在这种配置中,com.ambrosesoft.log.MyClass 类中的错误消息被发送给 FileAppender,后者将其写入一个名为 log.txt 的文件中。这些消息是根据与这个添加器相关的 layout(在这种情况中是 PatternLayout)进行格式化的。
 
清单 2. Log4J XML 配置样例文件
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
       
 <appender name="fileAppender" class="org.apache.log4j.FileAppender">
    <param name="File" value="log.txt"/>
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%t] %p - %m%n"/>
    </layout>
 </appender>
 
 <category name="com.ambrosesoft.log.MyClass">
    <priority value="error"/>
    <appender-ref ref="fileAppender"/>
 </category>
 
 <root>
    <priority value="debug"/>
    <appender-ref ref="fileAppender"/>
 </root>
 
</log4j:configuration>
0
相关文章