7.7.6 Java9新增的日志API
Java9
强化了原有的日志API
,这套日志API
只是定义了记录消息的最小API
,开发者可将这些日志消息路由到各种主流的日志框架(如SLF4J
、Log4J
等),否则默认使用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 logger = System.getLogger("fkjava"); Logger.getLogger("fkjava").setLevel(Level.SEVERE); 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 logger = System.getLogger("fkjava", rb); Logger.getLogger("fkjava").setLevel(Level.INFO); 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"); } }
|
该程序与前一个程序的区别就是粗体字代码,这行粗体字代码获取System.Logger
时加载了ResourceBundle
资源包。接下来调用System.Logger
的log()
方法输出日志信息时,第二个参数应该使用国际化消息key
,这样即可输出国际化的日志信息。
在简体中文环境下运行该程序,将会看到a.xml
文件中的日志信息是中文信息;在美式英文环境下运行该程序,将会看到a.xml
文件中的日志信息是英文信息