Java.util.logging:JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。
Java Logging API提供了七个日志级别用来控制输出。
级别 | 调用方法 | 含义 |
---|---|---|
SEVERE | severe() | 严重 |
WARNING | warning() | 警告 |
INFO | info() | 信息 |
CONFIG | config() | 配置 |
FINE | fine() | 良好 |
FINER | finer() | 较好 |
FINEST | finest() | 最好 |
相关术语
1. logger
- 代码需要输入日志的地方都会用到Logger,这几乎是一个JDK logging模块的代言人,我们常常用Logger.getLogger("com.aaa.bbb");获得一个logger,然后使用logger做日志的输出。
- logger其实只是一个逻辑管理单元,其多数操作都只是作为一个中继者传递别的角色,比如说:Logger.getLogger(“xxx”)的调用将会依赖于LogManager类,使用logger输入日志信息的时候会调用logger中的所有handler进行日志的输入。
- logger是有层次关系的,每个logger通常以java包名为其名称。子logger通常会从父logger继承logger级别、handler、Resource等。
整个JVM会存在一个名称为空的root logger,所有匿名的logger都会把root logger作为其父。
LogManager
- 整个JVM内部所有logger的管理,logger的生成、获取等操作都依赖于它,也包括配置文件的读取。LogManager中会有一个Hashtable[
private Hashtable<String,WeakReference<Logger>> loggers
]用于存储目前所有的logger,如果需要获取logger的时候,Hashtable已经有存在logger的话就直接返回Hashtable中的,如果hashtable中没有logger,则新建一个同时放入Hashtable进行保存。
2. Handler
- 用来控制日志输出的,比如JDK自带的ConsoleHanlder把输出流重定向到System.err输出,每次调用Logger的方法进行输出时都会调用Handler的publish方法,每个logger有多个handler。我们可以利用handler来把日志输入到不同的地方(比如文件系统或者是远程Socket连接).
3. Formatter
- 日志在真正输出前需要进行一定的格式化:比如是否输出时间?时间的格式?是否输入线程名?是否使用国际化信息等。
4. Log Level
- JDK Logging把日志分为如下几个级别,等级依次升高。all→finest→finer→fine→config→info→warning→server→off,如果将级别设为info,那么info之前的低级别信息将不会输出,只有info级别只有的信息会输出,通过控制级别达到控制输出的目的。需要注意,不仅是logger具有级别,handler也是有级别,也就是说如果某个logger级别是FINE,客户希望输入FINE级别的日志,如果此时logger对应的handler级别为INFO,那么FINE级别日志仍然是不能输出的。
对应关系
- LogManager与logger是1对多关系,整个JVM运行时只有一个LogManager,且所有的logger均在LogManager中。
- logger与handler是多对多关系,logger在进行日志输出的时候会调用所有的hanlder进行日志的处理。
- handler与formatter是一对一关系,一个handler有一个formatter进行日志的格式化处理。
- 很明显:logger与level是一对一关系,hanlder与level也是一对一关系 。
简单使用
public class LogJDKTest{
public static Logger log = Logger.getLogger(LogJDKTest.class.getName());
public static void main(String[] args){
// all→finest→finer→fine→config→info→warning→server→off
// 级别依次升高,后面的日志级别会屏蔽之前的级别
log.setLevel(Level.INFO);
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
}
}
public class LogJDKTest{
public static Logger log = Logger.getLogger(LogJDKTest.class.toString());
static{
// new一个控制台处理器
Handler console = new ConsoleHandler();
// 给处理器设置级别
console.setLevel(Level.SEVERE);
// 给logger设置处理器
log.addHandler(console);
}
public static void main(String[] args){
log.setLevel(Level.INFO);
log.finest("finest");
log.finer("finer");
log.fine("fine");
log.config("config");
log.info("info");
log.warning("warning");
log.severe("server");
}
}
网友评论