美文网首页
JDK自带的log工具

JDK自带的log工具

作者: 小布_cvg | 来源:发表于2019-07-30 12:44 被阅读0次

    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级别日志仍然是不能输出的。
    对应关系
    1. LogManager与logger是1对多关系,整个JVM运行时只有一个LogManager,且所有的logger均在LogManager中。
    2. logger与handler是多对多关系,logger在进行日志输出的时候会调用所有的hanlder进行日志的处理。
    3. handler与formatter是一对一关系,一个handler有一个formatter进行日志的格式化处理。
    4. 很明显: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");
        }
     
    }
    

    相关文章

      网友评论

          本文标题:JDK自带的log工具

          本文链接:https://www.haomeiwen.com/subject/jvderctx.html