前言
当前文章只是学习笔记,具体请点击超链接:视频
简介
JUL日志是JDK自带的日志工具。无需引入任何依赖。在日常开发中并不会使用到JUL日志,仅用来作为Java日志系统的入门级学习资料,这里就不再深入探究,只进行简单使用和了解。
使用
- Maven工程Pom.xml添加编译插件,以及单元测试依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
- 在代码中进行简单测试。可以看到控制台打印出日志了
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.Test;
public class JULTest {
@Test
public void testQuick() {
// 1. 获取日志对象。不是自己new。一般使用当前类名
Logger logger = Logger.getLogger("com.demo.jul.JULTest");
// 2. 输入日志
// info级别的日志
logger.info("info message");
// 通用的输出方法
logger.log(Level.INFO, "info message2");
// 占位符号输出
String name = "张三";
Integer age = 30;
logger.log(Level.INFO, "info message3,姓名:{0},年龄:{1}", new Object[]{name, age});
}
}
- 对日志进行一些自定义配置。下面我们同时在两个地方输出日志信息,一个地方在控制台,第二个地方在文本文件。首先要创建一个空的文本文件d:/logs/jul.log,不然在文件中输出日志时会报找不到文件异常。
@Test
public void testConfiguration() throws IOException {
// 1. 获取日志对象。不是自己new
Logger logger = Logger.getLogger("com.demo.jul.JULTest");
// 一、自定义控制台输出
// a. 关闭系统默认配置
logger.setUseParentHandlers(false);
// b. 创建Handler对象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c. 创建格式化对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
consoleHandler.setFormatter(simpleFormatter);
// e. 设置日志级别
consoleHandler.setLevel(Level.ALL);
// d. 进行关联
logger.addHandler(consoleHandler);
// 二、自定义文件日志输出
FileHandler fileHandler = new FileHandler("d:/logs/jul.log");
fileHandler.setFormatter(simpleFormatter);
fileHandler.setLevel(Level.INFO);
logger.addHandler(fileHandler);
// 输出日志
logger.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 testParent() {
// 创建两个日志对象
Logger logger1 = Logger.getLogger("com.demo.jul");
Logger logger2 = Logger.getLogger("com.demo.jul.JULTest");
System.out.println("logger1的parent:" + logger1.getParent());
System.out.println("logger2的parent:" + logger2.getParent());
System.out.println(logger1 == logger2.getParent());
}
运行结果:
从输出结果可以看出,logger1的父对象是默认的根结点对象。logger2的父对象是logger1。再把父对象的日志级别设置层最高级别,子对象的日志基本使用默认日志输出级别(Info)。然后输出。从结果中可以看出子对象继承使用了父对象的设置。
public Logger createCustomerLogger(Level level, String name) {
Logger logger = Logger.getLogger(name);
// 一、自定义控制台输出
// a. 关闭系统默认配置
logger.setUseParentHandlers(false);
// b. 创建Handler对象
ConsoleHandler consoleHandler1 = new ConsoleHandler();
// c. 创建格式化对象
SimpleFormatter simpleFormatter1 = new SimpleFormatter();
consoleHandler1.setFormatter(simpleFormatter1);
// e. 设置日志级别
consoleHandler1.setLevel(level);
// d. 进行关联
logger.addHandler(consoleHandler1);
return logger;
}
@Test
public void testParent() {
Logger logger1 = createCustomerLogger(Level.SEVERE, "com.demo.jul");
Logger logger2 = Logger.getLogger("com.demo.jul.JULTest");
logger1.severe("severe" + "-----" +logger1.getName());
logger1.warning("warning" + "-----" +logger1.getName());
logger1.info("info" + "-----" +logger1.getName());
logger1.config("config" + "-----" +logger1.getName());
logger1.fine("fine" + "-----" +logger1.getName());
logger1.finer("finer" + "-----" +logger1.getName());
logger1.finest("finest" + "-----" +logger1.getName());
logger2.severe("severe" + "-----" +logger2.getName());
logger2.warning("warning" + "-----" +logger2.getName());
logger2.info("info" + "-----" +logger2.getName());
logger2.config("config" + "-----" +logger2.getName());
logger2.fine("fine" + "-----" +logger2.getName());
logger2.finer("finer" + "-----" +logger2.getName());
logger2.finest("finest" + "-----" +logger2.getName());
}