JUL日志框架

目录

1 JUL简单介绍

2 JUL架构介绍

3 代码实践

3.1 日志输出

3.2 Logger对象父子关系

3.3 日志配置文件


1 JUL简单介绍

        jul全称java util Logging是Java原生的日志框架,使用时不需要引入第三方类库,性对于其他日志框架使用方便,学习简单,能够在小型应用中灵活应用。

2 JUL架构介绍

        

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

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

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

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

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

3 代码实践

3.1 日志输出

 如何用日志记录输出:

        //1. 获取日志记录器对象
        Logger logger = Logger.getLogger("com.liubujun.JulTest");
        //2. 日志记录输出
        logger.info("hello jul");

 日记记录输出通用方法:

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

 通过占位符方式输出变量值:

        // 通过占位符 方式输出变量值
        String msg = "呀呀呀";
        Integer a = 123;
        logger.log(Level.INFO,"用户信息:{0},{1}",new Object[]{msg,a});

以上3种方式打印结果:

但是对于JUL框架而言,它有着7种日志级别,默认的日志级别是Info,也就是说,日志级别比Info低的日志都不会打印。

测试:

@Test
public void testLevel(){
    //1. 获取日志记录器对象
    Logger logger = Logger.getLogger("com.liubujun.JulTest");
    logger.severe("severe");
    logger.warning("warning");
    logger.info("info");
    logger.config("config");
    logger.fine("fine");
    logger.finer("finer");
    logger.finest("finest");
}

 结果:

 由上面测试结果可知:日志级别比Info大的有severe和warning。

那么我们如何来自定义日志级别呢?

    @Test
    public void testLevel(){
        //1. 获取日志记录器对象
        Logger logger = Logger.getLogger("com.liubujun.JulTest");
        //关闭系统默认配置
        logger.setUseParentHandlers(false);

        //创建ConsoleHandler
        ConsoleHandler consoleHandler = new ConsoleHandler();

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

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

        //配置日志具体级别
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);

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

测试结果:

那么上面是将我们的日记记录输出到控制台的,那么如何将日志记录输出到磁盘文件呢?主要是用了FileHandler这个对象。看代码:

@Test
    public void testLevel() throws IOException {
        //1. 获取日志记录器对象
        Logger logger = Logger.getLogger("com.liubujun.JulTest");
        //关闭系统默认配置
        logger.setUseParentHandlers(false);

        //创建ConsoleHandler(控制台的输出)
        ConsoleHandler consoleHandler = new ConsoleHandler();

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

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

        //配置日志具体级别
        logger.setLevel(Level.ALL);
        consoleHandler.setLevel(Level.ALL);

        //将日志输出到磁盘
        FileHandler fileHandler = new FileHandler("C://Users//LiuBuJun//Desktop//日志//logs.log");
        fileHandler.setFormatter(simpleFormatter);
        logger.addHandler(fileHandler);

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

 由上面的代码我们是将日志记录器对象有两个处理器,一个控制台,一个是磁盘文件。测试结果:控制台已经正常打印,磁盘文件:

打开之后:

 

 可以发现和控制台的日志记录是一样的

3.2 Logger对象父子关系

测试代码:

    @Test
    public void testLogger(){
        Logger logger1 = Logger.getLogger("com.liubujun.JulTest");
        Logger logger2 = Logger.getLogger("com");
        System.out.println(logger1.getParent() == logger2);
        System.out.println("logger2 Parent:"+logger2.getParent()+",name"+logger2.getParent().getName());
    }

测试结果:

  由此看出:只要父包包含子包,那么子包会默认继承父包,没有父包就会默认继承LogManager$RootLogger,而RootLogger有默认的处理器和格式转换器、

3.3 日志配置文件

如果我们采用硬编码的方式去配置日志文件,那么可能会很麻烦,所有我们可以编写日志的配置文件:

配置文件(向控制台输出):

# RootLogger 顶级父元素指定的默认处理器为: ConsoleHandler
handlers = java.util.logging.ConsoleHandler

#RootLogger 顶级父元素默认的日志级别: ALL
.level = ALL



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


#向控制台输出的handle对象
#指定handle对象的日志级别
java.util.logging.ConsoleHandle.level = ALL
#指定handle对象的日志消息格式对象
java.util.logging.ConsoleHandle.formatter  = java.util.logging.SimpleFormatter

#指定handle对象的字符集
java.util.logging.ConsoleHandle.encoding = UTF-8 
#关闭默认配置级别
java.util.logging.ConsoleHandle.useParentHandlers = false

#指定日志消息格式
java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%n

测试代码:

    @Test
    public void testLoggerProperties() throws IOException {
        //通过类加载器 读取配置文件
        InputStream resourceAsStream = JulTest.class.getClassLoader().getResourceAsStream("logging.properties");

        //创建LogManager
        LogManager logManager = LogManager.getLogManager();
        //通过logManager加载配置文件
        logManager.readConfiguration(resourceAsStream);

        //创建日志记录器
        Logger logger = Logger.getLogger("com.liubujun");
        logger.severe("severe");
        logger.warning("warning");
        logger.info("info");
        logger.config("config");
        logger.fine("fine");
        logger.finer("finer");
        logger.finest("finest");


    }

测试结果:

配置文件(向磁盘输出):

# RootLogger 顶级父元素指定的默认处理器为: ConsoleHandler
handlers = java.util.logging.FileHandler

#RootLogger 顶级父元素默认的日志级别: ALL
.level = ALL


#向日志文件输出的 handle对象
#指定日志文件路径 /logs/java0.log
java.util.logging.FileHandler.pattern = C://Users//LiuBuJun//Desktop//log//logs.log
#指定日志文件内容大小
java.util.logging.FileHandler.limit = 50000
#指定日志文件数量
java.util.logging.FileHandler.count = 1
#指定handle对象日志消息格式对象
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
#指定已追加的方式添加日志内容
java.util.logging.FileHandler.append = true


#向控制台输出的handle对象
#指定handle对象的日志级别
java.util.logging.ConsoleHandle.level = ALL
#指定handle对象的日志消息格式对象
java.util.logging.ConsoleHandle.formatter  = java.util.logging.SimpleFormatter

#指定handle对象的字符集
java.util.logging.ConsoleHandle.encoding = UTF-8 
#关闭默认配置级别
java.util.logging.ConsoleHandle.useParentHandlers = false

#指定日志消息格式
java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%n

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值