JDK日志框架之自定义日志Formatter的出现又是一个闪亮的点,他是如何给我们带来兴奋地感觉呢?
JDK日志可以被格式化为一定格式的文本,也可以成为 XML 或者 Html 这样标准的格式。这取决于 Formatter 类的具体实现。 Formatter 抽象类提供了 format 成员函数用于扩展。一个典型的自定义 Formatter 类实现如清单 3 所示:
清单 3 LogRecord 类定义
- public class MyFormatter extends Formatter {
- private final String lineSeparator = System.getProperty("line.separator");
- @Override
- public String format(LogRecord record) {
- StringBuffer sb = new StringBuffer();
- String message = formatMessage(record);
- sb.append(record.getLevel().getLocalizedName());
- sb.append(message);
- sb.append(lineSeparator);
- if (record.getThrown() != null) {
- try {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- record.getThrown().printStackTrace(pw);
- pw.close();
- sb.append(sw.toString());
- } catch (Exception ex) {
- }
- }
- return sb.toString();
- }
- }
其中 formatMessage 方法提供了默认的将日志记录本地化和格式化的方法。它还能支持 java.text 风格的文本格式化,这只需要在调用 Logger 对象的 setMessage 方法设定 java.text 风格的格式字符串,同时通过 setParameters 方法设置参数,这样 formatMessage 将会根据所设置的 java.text 风格的格式字符串来格式化日志消息。总之,formatMessage 方法方便了子类格式化字符串。使子类只需要定义输出文本的格式而无需考虑本地化等问题。
自定义日志消息级别
JDK日志框架默认提供了 SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINEST 这几种日志级别。如果我们需要定义更多的日志级别,只需要继承 java.util.logging.Level 类,然后将自定义的级别作为静态成员变量声明即可。一个典型的自定义的消息类如清单 4 所示。
清单 4 自定义 Level 类
- public class MyLevel extends Level {
- protected MyLevel(String name, int value) {
- super(name, value);
- }
- public static final Level Level1 = new MyLevel("Level1", 123);
- ... // 其他自定义级别
- }
权重值 value 是一个整型数。在默认的 JDK日志级别中,SEVERE 的权重是 1000,FINEST 是 300,可以根据具体的需求来定义每个自定义级别的权重。例如在 WARNING 和 INFO 级别中加入一个新的级别,该级别的权重必须介于 800 到 900 之间。
自由的日志配置
和其他日志框架一样,JDK日志框架同样提供了强大的日志配置功能。你既可以通过代码进行动态配置,也可以通过配置文件来实现自由灵活的配置。通过代码动态配置,应用程序可以实现在运行过程中改变日志类的配置,动态地改变不同的配置组合。一个简单的动态配置代码如清单 5 所示。
清单 5 动态配置 Logger 对象
- public static void main(String[] args){
- Handler fh = new FileHandler("%t/wombat.log");
- Logger.getLogger("logname").addHandler(fh);
- Logger.getLogger("com.wombat").setLevel("com.wombat",Level.FINEST);
- ...
- }
配置文件的配置方法则同样灵活多变。它主要是在应用程序启动时根据一个指定的配置文件来设置日志对象。在配置文件中,日志对象是由其名称来标识的。一个典型的日志配置文件如清单 6 所示。
清单 6 jdk Logger 配置文件
# 设置日志对象的 Handler,日志对象的名称是 com.xyz.fOO
com.xyz.fOO.handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
# 设置日志对象的基本输出级别
com.xyz.fOO.level = INFO
#FileHandler 只允许输出 SEVERE 以上级别的JDK日志
java.util.logging.ConsoleHandler.level = SEVERE
#ConsoleHandler 允许输出 INFO 以上级别的JDK日志
java.util.logging.ConsoleHandler.level = INFO
当设置好一个日志配置文件后,在Java 程序的启动参数中,我们可以通过添加 -Djava.util.logging.config.file 参数来定义配置文件路径,一个典型的Java 命令行如下:
java -Djava.util.logging.config.file=logger.properties -cp . Mainclass
JDK日志框架之自定义日志Formatter就介绍到这里,这些组件要使用其实只需要能够在 classpath 中找到即可。
【编辑推荐】