JUL(Java util Logging)日志初步整合

一、JUL(Java util Logging)初步学习

JUL是Java原生的日志框架,很多项目在没有配置日志(slf4j或者log4j)时会默认使用jul作为最后的日志实现

Java Logging Technology–java日志简介

Logger的大致处理流程

JUL(Java util Logging)日志初步整合_第1张图片

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

2.Appenders:也被称为Handlers,每个Logger都会关联一组Handlers,Logger会将日志交换关联Handlers处理,由Handlers负责将日志做记录,Handlers在此是一个抽象,其具体的实现决定了日志记录的位置可以是控制台、文件、网络上的其他日志服务或者操作系统日志等

3.Layouts:也被称为Formatters,它负责对日志事件中的数据进行转化和格式化,Layouts决定了数据在一条日志记录中的最终形式。

4.level:每条日志的消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,我可以将level和loggers,Appenders做关联以便于我们过滤消息。

5.Filters:过滤器,根据需要定制那些信息会被记录,哪些信息会被放过

创建Logger对象

// 为指定子系统查找或创建一个 logger。
static Logger getLogger(String name) 
// 为指定子系统查找或创建一个 logger。
static Logger getLogger(String name, String resourceBundleName)

 注意:name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个。

//  1.   快速入门
    @Test
    public void testQuick() throws Exception{
//        1.获取日志记录器对象
        Logger logger = Logger.getLogger("LoggerDemo.JULTest");
//        2.日志记录输出
        logger.info("hello jul");

//        通用方法进行日志记录
        logger.log(Level.INFO,"info msg");

//        通过占用符 方式输出变量值
        String name = "com.jul";
        Integer age = 13;

        logger.log(Level.INFO,"用户信息:{0},{1}",new Object[]{name,age});
    }

Logger的级别
        在进行信息的记录时,依信息程序的不同,会设定不同等级的信息输出。Java log比log4j的级别详细,全部定义在java.util.logging.Level里面。Java的一个日志级别对应一个整数值,Level有9个内置的级别,分别是:

类型

对应的整数

OFF

最大整数( Integer. MAX_VALUE)

SEVERE

1000(最高值)

WARNING

900

INFO

800

CONFIG

700

FINE

500

FINER

400

FINEST

300(最低值)

ALL

最小整数(Integer. MIN_VALUE)


此外,级别OFF是用来关闭日志记录,级别ALL是启用所有消息的日志记录。

logger默认的级别是INFO,比INFO更低的日志将不显示。

//  2.  日志级别
    @Test
    public void testLogLevel() throws Exception{
//        1.获取日志记录器对象
        Logger logger = Logger.getLogger("LoggerDemo.JULTest");
//        2.日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");//jul默认的日志级别info
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");

    }

//  3.  自定义日志级别
    @Test
    public void testLogConfig() throws Exception{
//        1.获取日志记录器对象
        Logger logger = Logger.getLogger("LoggerDemo.JULTest");
//        关闭系统默认配置
        logger.setUseParentHandlers(false);

//        自定义配置日志级别
//        创建ConsolHandler
        ConsoleHandler consoleHandler = new ConsoleHandler();

//        创建简答格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();

//        进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger.addHandler(consoleHandler);

//        配置日志具体级别Level.ALL表示显示所有的信息,所有这一次的执行结果可显示所有等级的信息。如果要关闭所有的信息,可以设定为Level.OFF。
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);

//        场景FileHandler文件输出
        FileHandler fileHandler = new FileHandler("/logs/jul.log");

//        进行关联
        fileHandler.setFormatter(simpleFormatter);
        logger.addHandler(fileHandler);

//        2.日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");//jul默认的日志级别info
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");

    }
//  4.  Logger对象父子关系 子级继承父级
    @Test
    public void testLogParent() throws Exception{
        Logger logger1 = Logger.getLogger("com.jultest");
        Logger logger2 = Logger.getLogger("com");
//        关闭日志默认选项
        logger2.setUseParentHandlers(false);

//        测试
        System.out.println(logger1.getParent() == logger2);

//        所有日志记录器的顶级父元素LogManager$RootLogger@3b22cdd0,name: ""
        System.out.println("logger2 parent:"+logger2.getParent()+",name:"+logger2.getParent().getName());

//        自定义配置日志级别
//        创建ConsolHandler
        ConsoleHandler consoleHandler = new ConsoleHandler();

//        创建简答格式转换对象
        SimpleFormatter simpleFormatter = new SimpleFormatter();

//        进行关联
        consoleHandler.setFormatter(simpleFormatter);
        logger2.addHandler(consoleHandler);

//        配置日志具体级别
        logger2.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);
//        2.日志记录输出
        logger1.severe("severe");
        logger1.warning("warning");
        logger1.info("info");//jul默认的日志级别info
        logger1.config("config");
        logger1.fine("fine");
        logger1.finer("finer");
        logger1.finest("finest");

    }

二、JUL日志原理解析:

1.初始化LogManager:LogManager加载logging.properties配置;添加Logger到LogManager

2.从单例LogManager获取Logger

3.设置级别Level,并指定日志记录LogRecord

4.Filter提供了日志级别之外更细粒度的区别

5.Handlers是用来处理日志输出位置,Java SE实现了5个Handler:

        1)    java.util.logging.ConsoleHandler 以System.err输出日志。

        2)    java.util.logging.FileHandler 将信息输出到文件。

        3)    java.util.logging.StreamHandler以指定的OutputStream实例输出日志。

        4)    java.util.logging.SocketHandler将信息通过Socket传送至远程主机。

        5)    java.util.logging.MemoryHandler将信息暂存在内存中。

6.Formatter为格式化LogRecords提供支持。一般来说,每个Handler都有关联的Formatter。Formatter接受LogRecord,并将它转换为一个字符串。

        默认提供了两种Formatter:

        1.java.util.logging.SimpleFormatter:标准日志格式,就是我们通常在启动一些诸如 Tomcat、 JBoss之类的服务器的时候经常能在控制台下看到的那种形式。

        2.java.util.logging.XMLFormatter:XML形式的日志格式,如果为Logger添加了一个newXMLFormatter(),那么就会以XML形式输出,不过更常用的是使用上面介绍的FileHandler输出到XML文件中。

        FileHandler的默认格式是java.util.logging.XMLFormatter,而ConsolerHandler的默认格式是java.util.logging.SimpleFormatter,可以使用Handler实例的setFormatter()方法来设定信息的输出格式。

        FileHandler的Formatter设定为SimpleFormatter,则输出的日志文件内容就是简单的文字信息,打开文件后会发现与命令行模式下看到的信息内容相同。

<--
    java默认log配置文件:
    这样在maven项目中快速使用jul日志,项目根目录新建配置文件logging.properties
-->

handles = java.util.logging.ConsoleHandler,java.util.logging.FileHandler
<--.level 是针对所有handler与包的根日志级别;ConsoleHandler.level是使用Console这个handler的logger级别-->
.level = ALL

java.util.logging.FileHandler.pattern = /logs/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
//  5.  加载自定义配置文件测试Demo
    @Test
    public void testLogProperties() throws Exception{
//        读取配置文件,通过类加载器
        InputStream ins = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");

//        创建LogManager
        LogManager logManager = LogManager.getLogManager();

//        通过LogManager加载配置文件
        logManager.readConfiguration(ins);

//        创建日志记录器
        Logger logger = Logger.getLogger("LoggerDemo.JULTest");

//        2.日志记录输出
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");//jul默认的日志级别info
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");


        //        创建日志记录器
        Logger logger2 = Logger.getLogger("test");

//        2.默认日志记录输出和读取配置文件日志记录输出的比较
        logger2.severe("severe test ");
        logger2.warning("warning test ");
        logger2.info("info test ");//jul默认的日志级别info
        logger2.config("config test ");
        logger2.fine("fine test ");
        logger2.finer("finer test ");
        logger2.finest("finest test ");
    }

java.util.logging包中类的关系图如下:

你可能感兴趣的:(Java)