0%

7.7.6 Java9新增的日志API

7.7.6 Java9新增的日志API

Java9强化了原有的日志API,这套日志API只是定义了记录消息的最小API,开发者可将这些日志消息路由到各种主流的日志框架(如SLF4JLog4J等),否则默认使用Java传统的java.util.logging日志API
这套日志API的用法非常简单,只要两步即可:

  • 调用System类的getLogger(String name)方法获取System.Logger对象。
  • 调用System.Logger对象的log()方法输出日志。该方法的第一个参数用于指定日志级别。

为了与传统java.util.logging日志级别、主流日志框架的级别兼容。Java9定义了如下表所示的日志级别。

Java9日志级别 对应的传统日志级别 说明
ALL ALL 最低级别,系统将会输出所有日志信息。因此将会生成非常多、非常冗余的日志信息。
TRACE FINER 输出系统的各种跟踪信息,也会生成很多、很冗余的日志信息
DEBUG FINE 输出系统的各种调试信息,会生成较多的日志信息
INFO INFO 输出系统内需要提示用户的提示信息,生成中等冗余的日志信息
WARNING WARNING 只输出系统内警告用户的警告信息,生成较少的日志信息
ERROR SEVERE 只输出系统发生错误的错误信息,生成很少的日志信息
OFF OFF 关闭日志输出

使用日志的好处

该日志级别是一个非常有用的东西:在开发阶段调试程序时,可能需要大量输出调试信息;在发布软件时,又希望关掉这些调试信息。此时就可通过日志来实现,只要将系统日志级别调高,所有低于该级别的日志信息就都会被自动关闭,如果将日志级别设为OFF,那么所有日志信息都会被关闭。

示例 java9新增的日志API

例如,如下程序示范了Java9新增的日志API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.logging.*;

public class LoggerTest {
public static void main(String[] args) throws Exception {
// 获取System.Logger对象
System.Logger logger = System.getLogger("fkjava");
// 设置系统日志级别(FINE对应DEBUG)
// Logger.getLogger("fkjava").setLevel(Level.FINE);
// Logger.getLogger("fkjava").setLevel(Level.INFO);
Logger.getLogger("fkjava").setLevel(Level.SEVERE);
// 设置使用a.xml保存日志记录
Logger.getLogger("fkjava").addHandler(new FileHandler("a.xml"));
logger.log(System.Logger.Level.DEBUG, "debug信息");
logger.log(System.Logger.Level.INFO, "info信息");
logger.log(System.Logger.Level.ERROR, "error信息");
}
}

Java9日志API国际化

除简单使用之外,Java9的日志API也支持国际化:
System类除使用简单的getLogger( String name)方法获取System.Logger对象之外,还可使用getLogger(String name, ResourceBundle bundle)方法来获取该对象,该方法需要传入一个国际化语言资源包,这样该Logger对象即可根据key来输出国际化的日志信息。

先为美式英语环境提供一个logMess_en_US.properties文件,该文件的内容如下:

1
2
3
debug=Debug Message
info=Plain Message
error=Error Message

再为简体中文环境提供一个logMess_zh_CN.properties文件,该文件的内容如下:

1
2
3
debug=调试信息
info=普通信息
error=错误信息

接下来程序可使用ResourceBundle先加载该国际化语言资源包,然后就可通过Java9的日志API来输出国际化的日志信息了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.logging.*;
import java.util.*;

public class LoggerI18N {
public static void main(String[] args) throws Exception {
// 加载国际化资源包
ResourceBundle rb = ResourceBundle.getBundle("logMess", Locale.getDefault(Locale.Category.FORMAT));
// 获取System.Logger对象
System.Logger logger = System.getLogger("fkjava", rb);
// 设置系统日志级别(FINE对应DEBUG)
Logger.getLogger("fkjava").setLevel(Level.INFO);
// 设置使用a.xml保存日志记录
Logger.getLogger("fkjava").addHandler(new FileHandler("a.xml"));
// 下面3个方法的第二个参数是国际化消息的key
logger.log(System.Logger.Level.DEBUG, "debug");
logger.log(System.Logger.Level.INFO, "info");
logger.log(System.Logger.Level.ERROR, "error");
}
}

该程序与前一个程序的区别就是粗体字代码,这行粗体字代码获取System.Logger时加载了ResourceBundle资源包。接下来调用System.Loggerlog()方法输出日志信息时,第二个参数应该使用国际化消息key,这样即可输出国际化的日志信息。
在简体中文环境下运行该程序,将会看到a.xml文件中的日志信息是中文信息;在美式英文环境下运行该程序,将会看到a.xml文件中的日志信息是英文信息

原文链接: 7.7.6 Java9新增的日志API