方法来设定 Handler,Level 和 Formatter 。最后在调用 JDK 的日志对 象的 log 方法记录了 4 种自定义级别的日志。
清单 12 一个完整的例子
package demo.staflog;
import java.util.logging.Logger;
public class STAFLoggerTest {
public static void main(String[] args) {
Logger logger = Logger.getLogger(STAFLoggerTest.class.getName());
logger.setUseParentHandlers(false);
logger.setLevel(STAFLevel.DEBUG);
STAFHandler stafHandler = new STAFHandler("staflogger");
stafHandler.setLevel(STAFLevel.DEBUG);
stafHandler.setFormatter(new STAFFormatter());
logger.addHandler(stafHandler);
//log
logger.log(STAFLevel.DEBUG, "debug log");
logger.log(STAFLevel.FATAL, "fatal log");
logger.log(STAFLevel.ERROR, "error log");
logger.log(STAFLevel.TRACE, "trace log");
}
}
但我们也可以将这些代码改为配置文件的方式,其配置文件如清单 13 所示:
清单 13 STAFLog 类定义
# 设置日志对象的 Handler
demo.staflog.STAFLoggerTest.handlers= demo.staflog.STAFHandler
demo.staflog.STAFLoggerTest.level = DEBUG
# 取消发送日志到父 Logger 对象
demo.staflog.STAFLoggerTest.useParentHandlers = FALSE
# 设置 Handler 的名称,输出级别和格式化对象
demo.staflog.STAFHandler.name= staflogger
demo.staflog.STAFHandler.level = DEBUG
demo.staflog.STAFHandler.formatter = demo.staflog.STAFFormatter
这样代码可以简化为清单 14 。
清单 14 STAFLog 类定义
public class STAFLoggerTest {
private static Level defaultLevel = STAFLevel.DEBUG;
public static void main(String[] args) {
//log
logger.log(STAFLevel.DEBUG, "debug log");
logger.log(STAFLevel.FATAL, "fatal log");
logger.log(STAFLevel.ERROR, "error log");
logger.log(STAFLevel.TRACE, "trace log");
}
}
配置文件的方式相对于动态配置的方式更加灵活,因为这无需改变和重新编译代码,只需要修改配置文件,就能修改日志中 Handler, Level 和 Formatter 的组合配置,这对于已经部署发布的软件而言,有着更为实际的意义。
当运行代码后,在命令行中输入 STAF 命令来显示 STAF 日志 staflogger:
mymachine:~ myname$ staf local log query machine mymachine logname staflogger
Response
--------
Date-Time Level Message
----------------- ----- ----------
20081111-16:15:21 Debug debug log
20081111-16:15:21 Fatal fatal log
20081111-16:15:21 Error error log
20081111-16:15:21 Trace trace log
这显示了我们刚才在 Java 代码中记录的信息,它们已经被输出到 STAF 的日志服务中了。
结束语
JDK 日志框架简单灵活,它虽然比 log4j 出现的时期晚,但其功能并不比 log4j 少。而且 JDK 日志框架直接隶属于 JDK,被 Java 标准 所支持而无需安装第三方库文件。本文介绍了 JDK 日志框架的结构,如何扩展 JDK 日志框架使之满足实际的项目需求。并以如何在 Java 程 序中将日志输出到 STAF 的日志服务中为例,一步步描述了如何实现扩展 JDK 日志组件,使之和 STAF 日志服务结合到一起,同时如何创建灵 活的配置文件来组合日志框架组件。希望本文可以给其他需要扩展 JDK 日志组件的开发者提供帮助。
本文配套源码 |