JUL的使用


JUL全程Java Util Logging,它是java原生的日志框架,使用时不需要另外引入第三方的类库,相对于其他的框架使用方便,学习简单,主要是使用在小型应用中。

  应用程序(Application)--运行->日志记录器(Logger)- 记录日志->日志处理器(Handler)--处理日志-->日志输出

其中(日志记录器)LoggerHandler(日志处理器)共有的组件(Filters)、日志格式化组件(Fomatters)和日志输出级别(Level)

Logger:被称为记录器,应用程序通过获取Logger对象,抵用其API来发布日志信息。Logger通常被认为是访问日志系统的入口程序。

Handler:处理器,每一个Logger都会关联一个或者是一组Handler,Logger会将日志交给关联的Handler去做处理,由Handler负责将日志做记录。Handler具体实现了日志的输出位置,比如你可以输出到控制台或者是文件夹中等等。

Filter:过滤器,根据需要定制哪些信息会被记录,哪些信息会被略过

Formatter:格式化组件,它负责对日志的数据和信息进行转换和格式化,所以它决定了我们输出日志最终的形式 。

Level:日志的输出级别,每条日志都有一个关联的级别,我们根据输出级别的设置,用来展现最终呈现的日志信息。根据不同的需求,去设置不同的级别。

写一个案列:

创建一个普通的Java项目就行

包名是公司名的倒写

入门案列

JUL打印日志信息动态传递数据

日志级别的说明:

/*
* 日志的级别(通过源码查看)
* SEVERE:错误---最高级别的日志级别
* WARNING---警告
* INFO:(默认级别)消息
* CONFIG:配置
* FINR:详细信息()
* FINER:详细信息()
* FINEST:详细信息()----最低的日志级别
*两个特殊的级别
* OFF 可用来关闭日志记录
* ALL 启动所有消息的日志记录
*
* 对于日志的级别,我们重点关注的是nue对象的时候的第二个参数是一个数值
* OFF Integer.MAX_VALUE 整形最大值
*
* SEVERE 1000
* WARNING 900
* ...
* ...
* FINEST 300
*
* ALL Integer.MIN_VALUE 整形最小值
* 这个数值的意义在于,如果我们设置的日志级别是INFO--800
* 那么最后输出的日志信息必须数值大于800的所有的日志信息
* SEVERE
* WARNING
*  */

JUL默认级别源码打印效果:

/*
* 通过打印结果,可以看出只输出info级别及比info级别高的日志信息
* info级别低的日志信息没有输出出来
* 证明了info级别的日志信息是系统默认的日志信息
* 在默认日志级别info基础上打印比它更高的信息
* */
Logger logger = Logger.getLogger("com.xcuni.JUL.test");
logger.severe("severe信息");
logger.warning("warning信息");
logger.info("info信息");
logger.config("config信息");
logger.fine("fine信息");
logger.finer("finer信息");
logger.finest("finest信息+");

/*
* 如果只是通过以下形式来设置日志级别
* 那么不能起到效果
* 将来更要搭配处理器Handler公共设置才会生效
* */
logger.setLevel(Level.CONFIG);

 

/*

JUL自定义日志级别

*/

@Test
public void test03(){
    /*
    * 自定义日志的级别
    * */
    //日志记录器
    Logger logger = Logger.getLogger("com.xcuni.JUL.test");
    //将默认的日志打印方式关闭掉
    //参数设置为false,我们打印日志的方式就不会按照logger默认的方式去进行操作
    logger.setUseParentHandlers(false);
    //处理器Handler
    //在此我们使用控制台日志处理器
    ConsoleHandler handler = new ConsoleHandler();
    //创建日志格式化组件对象
    SimpleFormatter formatter = new SimpleFormatter();
    //在处理器中设置输出格式
    logger.addHandler(handler);
    //设置日志的打印级别
    //此处必须讲日志记录器和处理器进行统一处理,才会达到日志显示相应级别的效果
    //logger.setLevel(Level.CONFIG);
    //handler.setLevel(Level.CONFIG);
    logger.setLevel(Level.ALL);
    handler.setLevel(Level.ALL);
    logger.severe("severe信息");
    logger.warning("warning信息");
    logger.info("info信息");
    logger.config("config信息");
    logger.fine("fine信息");
    logger.finer("finer信息");
    logger.finest("finest信息");
}

文件中日志的打印

@Test
public void test04(){
        /*
        * 将日志输出到具体的磁盘文件
        * 这样做相当做了日志的持久化操作
        * */
    Logger logger = Logger.getLogger("com.xcuni.JUL.test");
    logger.setUseParentHandlers(false);
//文件日志处理器
    try {
        FileHandler fileHandler = new FileHandler("D:\\myLogTest.log");
        SimpleFormatter formatter = new SimpleFormatter();
        fileHandler.setFormatter(formatter);
        logger.addHandler(fileHandler);

        logger.setLevel(Level.ALL);
        fileHandler.setLevel(Level.ALL);
        logger.severe("severe信息");
        logger.warning("warning信息");
        logger.info("info信息");
        logger.config("config信息");
        logger.fine("fine信息");
        logger.finer("finer信息");
        logger.finest("finest信息");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

日志添加多个处理类:

@Test
public void test04(){
        /*
        * 将日志输出到具体的磁盘文件
        * 这样做相当做了日志的持久化操作
        * */
    Logger logger = Logger.getLogger("com.xcuni.JUL.test");
    logger.setUseParentHandlers(false);
//文件日志处理器
    try {
        FileHandler fileHandler = new FileHandler("D:\\myLogTest.log");
        SimpleFormatter formatter = new SimpleFormatter();
        fileHandler.setFormatter(formatter);
        logger.addHandler(fileHandler);

        //又可以同时在控制台和文件中进行打印
        ConsoleHandler handler = new ConsoleHandler();
        handler.setFormatter(formatter);
        logger.addHandler(handler);

        logger.setLevel(Level.ALL);
        fileHandler.setLevel(Level.ALL);
        handler.setLevel(Level.ALL);

        logger.severe("severe信息");
        logger.warning("warning信息");
        logger.info("info信息");
        logger.config("config信息");
        logger.fine("fine信息");
        logger.finer("finer信息");
        logger.finest("finest信息");

        /*
        * 总结:
        * 用户使用Logger‘来进行日志的记录,Logger可以有多个处理器Handler
        * (日志的记录使用的是Logger,日志的输出 handler
        * 添加了哪些Handler对象就相当于需要所添加到handler
        * 将日志输出到指定的位置上、例如控制台、文件.....
        * */
    } catch (IOException e) {
        e.printStackTrace();
    }
}

JULLogger的父子节点

@Test
public void test05(){
    /*
     *Logger之间的父子关系
     * JULLogger之间是存在这种关系的
     * 值得注意的是,这种父子关系不是我们认为普遍认为的类之间的继承关系
     * 关系是通过树状态存储的
     * */
    /*
    * 从下面创建的两个logger对象看来
    * 我们可以认为logger1logger2的父亲
    * */
    //父亲是RootLogger,名称默认是一个空的对象
    //RootLogger可以被称为所有logger对象的顶层logger
    Logger logger = Logger.getLogger("com.xcuni.JUL");
    Logger logger1 = Logger.getLogger("com.xcuni.JUL.test");
    Logger logger2 = Logger.getLogger("com.xcuni.JUL.test.JULTest");

  //  System.out.println(logger2.getParent()==logger1);//true
    System.out.println("logger1的父Logger引用为:"
            +logger1.getParent()+";名称为"+logger1.getName()+";父亲的名称为"+logger1.getParent().getName());

    System.out.println("logger2的父Logger引用为:"
            +logger2.getParent()+";名称为"+logger2.getName()+";父亲的名称为"+logger2.getParent().getName());

}

作用2

@Test
public void test05(){
    /*
     *Logger之间的父子关系
     * JULLogger之间是存在这种关系的
     * 值得注意的是,这种父子关系不是我们认为普遍认为的类之间的继承关系
     * 关系是通过树状态存储的
     * */
    /*
    * 从下面创建的两个logger对象看来
    * 我们可以认为logger1logger2的父亲
    * */
    //父亲是RootLogger,名称默认是一个空的对象
    //RootLogger可以被称为所有logger对象的顶层logger
    Logger logger = Logger.getLogger("com.xcuni.JUL");
    Logger logger1 = Logger.getLogger("com.xcuni.JUL.test");
    Logger logger2 = Logger.getLogger("com.xcuni.JUL.test.JULTest");

  //  System.out.println(logger2.getParent()==logger1);//true
    System.out.println("logger1的父Logger引用为:"
            +logger1.getParent()+";名称为"+logger1.getName()+";父亲的名称为"+logger1.getParent().getName());

    System.out.println("logger2的父Logger引用为:"
            +logger2.getParent()+";名称为"+logger2.getName()+";父亲的名称为"+logger2.getParent().getName());
/*
* 父亲所做的设置,也可以能够同时作于儿子
* 对于logger1做日志打印相关的设置,然后我们使用logger2进行日志的打印
* */
    //父亲做设置
    logger1.setUseParentHandlers(false);
    ConsoleHandler handler = new ConsoleHandler();
    SimpleFormatter formatter = new SimpleFormatter();
    handler.setFormatter(formatter);
    logger1.addHandler(handler);
    logger1.setLevel(Level.ALL);
    handler.setLevel(Level.ALL);

    //儿子做设置
    logger2.severe("severe信息");
    logger2.warning("warning信息");
    logger2.info("info信息");
    logger2.config("config信息");
    logger2.fine("fine信息");
    logger2.finer("finer信息");
    logger2.finest("finest信息");

}