【译文】Java Logging

本文讲Java内置的java.util.logging软件包中的 api。主要解释怎样使用该api添加logging到你的application中,怎样加配置它等。但是本文不谈你应该把什么东西写到日志中。

Note :本文谈到的api是Java 6中的。不涉及其他流行的Java logging api(比如Log4J, SLF4J, Apache Commons Logging, LogBack 等)。它只关注Java内置的API。

如果你能够选择你自己的logging api,你也许可以选择上面提到的流行api。但是,如果你像我一样,正在开发Google APP Engine上的web应用,那么你不得不使用java.util.logging。

Java Logging: 综述

下图是Java Logging API工作的概况示意图:

【译文】Java Logging

所有的logging都是通过一个Loger 实例产生的,Logger收集数据,保存到LogRecord。LogRecord转发到Handler。Handler来决定怎么处理这些LogRecord。例如,LogRecord可以写到disk,或者通过网络发送到一个监控系统。

Logger和Handler都可以使用Filter来筛选LogRecord,来决定是否转发。 

  • Log Level 每一条message都包含一个log level的标签。这个level是一个整数,用来标识这条message的重要性。数值越大,重要性越高。
  • Logger Hierachy Logger实例按层级组织,底层的Logger获得的信息会转发到祖先Logger。因此,log level 和 messages 可以被筛选,或者选择是否接受整个Logger分支。
  • LogManager 用来控制Logger hierarchy, 同时还管理一个全局的日志配置文件。

 Java Logging: 基本使用方法

通常的做法是,在需要添加日志的类中创建一个 static final的Logger 实例,所有该类的对象共享该实例。例子如下:

public class LoggingExamples {

    private static final Logger logger =
        Logger.getLogger(LoggingExamples.class.getName()); // 通常把该类的全名作为Logger的名字
  public void doIt() {
        logger.entering(getClass().getName(), "doIt");

        try{
            //... something that can throw an exception
        } catch (Exception e) {
            logger.log(Level.SEVERE, "Error doing XYZ", e);
        }

        logger.exiting(getClass().getName(), "doIt");
    }
}

 Java Logging: Logger类

为了产生一条message,你可以调用以下方法:

//log 组产生指定level上的message
log (Level level, String message); log (Level level, String message, Object param1); //对象信息被插入到message中 log (Level level, String message, Object[] params); //示例: logger.log(Level.SEVERE, "Hello logging: {0}, {1}",     new Object[] {"P1", "P2"}); 注意传参数的格式 log (Level level, String message, Throwable t); log (LogRecord record);
//在log()的基础上增加了sourceClass和sourceMethod俩个参数,用来说明这条message产生自那个类的那个方法。 logp (Level level, String sourceClass, String sourceMethod, String msg); logp (Level level, String sourceClass, String sourceMethod, String msg, Object param1); logp (Level level, String sourceClass, String sourceMethod, String msg, Object[] params); logp (Level level, String sourceClass, String sourceMethod, String msg, Throwable t);
//在logp()基础上增加了bundle。Resource bundle是一些键值对,主要用于国际化 logrb(Level level, String sourceClass, String sourceMethod, String bundle, String msg); logrb(Level level, String sourceClass, String sourceMethod, String bundle, String msg, Object param1); logrb(Level level, String sourceClass, String sourceMethod, String bundle, String msg, Object[] params); logrb(Level level, String sourceClass, String sourceMethod, String bundle, String msg, Throwable t); entering(String sourceClass, String sourceMethod); entering(String sourceClass, String sourceMethod, Object param1); entering(String sourceClass, String sourceMethod, Object[] params); exiting (String sourceClass, String sourceMethod); exiting (String sourceClass, String sourceMethod, Object result); fine (String message); finer (String message); finest (String message); config (String message); info (String message); warning (String message); severe (String message); throwing(String sourceClass, String sourceMethod, Throwable t);

//几个重要的函数
void addHandler(Handler handler) Add a log Handler to receive logging messages. 每一个Handler可以调用setFormatter函数设置输出格式
void setFilter(Filter newFilter) Set a filter to control output on this Logger.
void setLevel(Level newLevel) Set the log level specifying which message levels will be logged by this logger.

 原文地址:在这里