1.新建maven工程 log-study
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lxcourse</groupId>
<artifactId>log-study</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>jul-demo</module>
</modules>
<packaging>pom</packaging>
</project>
2.新建module,jul-demo
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>log-study</artifactId>
<groupId>com.lxcourse</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jul-demo</artifactId>
<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>
</project>
JULDemo.java
package com.lxcourse.jul;
import org.junit.Test;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author doubledumbao
*/
public class JULDemo {
/**
* 快速入門
*/
@Test
public void testQuick() {
//獲取日志記錄器對象
Logger logger = Logger.getLogger("com.lxcourse.jul.JULDemo");
//日志記錄輸出
logger.info("hello jul");
//通用方法進行日志記錄
logger.log(Level.INFO, "hello world");
//占位符方式輸出變量值
logger.log(Level.INFO, "用戶信息:姓名:{0},年齡:{1}", new Object[]{"zhangsan", 23});
}
}
/**
* 測試日志級別
*/
@Test
public void testLevel(){
//獲取日志記錄器對象
Logger logger = Logger.getLogger("com.lxcourse.jul.JULDemo");
//日志級別
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
/**
* 自定義日志級別
*/
@Test
public void testLogConfig() throws IOException {
//獲取日志記錄器對象
Logger logger = Logger.getLogger("com.lxcourse.jul.JULDemo");
//關閉默認日志級別
logger.setUseParentHandlers(false);
//輸出到控制台
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("/Users/doubledumbao/logs/jul.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");
}
/**
* 日志對象父子關系
*/
@Test
public void testLogParent(){
//子
Logger logger1 = Logger.getLogger("com.lxcourse");
//父
Logger logger2 = Logger.getLogger("com");
System.out.println(logger1.getParent() == logger2);
//所有日志記錄器的頂級父元素java.util.logging.LogManager$RootLogger ,name ""
System.out.println("logger2 parent:"+logger2.getParent()+",name:"+logger2.getParent().getName());
//關閉默認配置
logger2.setUseParentHandlers(false);
ConsoleHandler consoleHandler = new ConsoleHandler();
SimpleFormatter simpleFormatter = new SimpleFormatter();
consoleHandler.setFormatter(simpleFormatter);
logger2.addHandler(consoleHandler);
logger2.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
//日志級別
logger1.severe("severe");
logger1.warning("warning");
logger1.info("info");
logger1.config("config");
logger1.fine("fine");
logger1.finer("finer");
logger1.finest("finest");
}
/**
* 配置文件
* @throws IOException
*/
@Test
public void testConfigFile() throws IOException {
InputStream inputStream = JULDemo.class.getClassLoader().getResourceAsStream("logging.properties");
Logger logger = Logger.getLogger("com.lxcourse.jul.JULDemo");
LogManager manager = LogManager.getLogManager();
manager.readConfiguration(inputStream);
//日志級別
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
Logger logger2 = Logger.getLogger("com.lxcourse");
logger2.severe("severe test");
logger2.warning("warning test");
logger2.info("info test");
logger2.config("config test");
logger2.fine("fine test");
logger2.finer("finer test");
logger2.finest("finest test");
}
# RootLogger 頂級父元素指定的默認處理器為ConsoleHandler
#handlers=java.util.logging.FileHandler
#handlers=java.util.logging.ConsoleHandler
handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler
# RootLogger 頂級父元素默認的日志級別為:ALL
.level=ALL
# 自定義Logger使用
com.lxcourse.handlers = java.util.logging.ConsoleHandler
com.lxcourse.level = CONFIG
# 關閉默認配置
com.lxcourse.useParentHandlers = false
# 向日志文件輸出的handler對象
# 指定日志文件路徑 /Users/doubledumbao/logs/java0.log
java.util.logging.FileHandler.pattern=/Users/doubledumbao/logs/java%u.log
# 指定日志文件內容大小
java.util.logging.FileHandler.limit=50000
# 指定日志文件數量
java.util.logging.FileHandler.count=1
# 指定handler對象日志消息格式對象
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
# 指定以追加方式添加日志內容
java.util.logging.FileHandler.append=true
# 向控制台輸出handler對象
# 指定handler對象日志級別
java.util.logging.ConsoleHandler.level=ALL
# 指定handler對象的日志消息格式對象
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
# 指定handler對象的字符集
java.util.logging.ConsoleHandler.encoding=UTF-8
# 指定日志消息格式
java.util.logging.SimpleFormatter.format = %4$s: %5$s [%1$tc]%n
3.日志原理解析
日志原理解析
1. 初始化LogManager
1. LogManager加載logging.properties配置
2. 添加Logger到LogManager
2. 從單例LogManager獲取Logger
3. 設置級別Level,並指定日志記錄LogRecord
4. Filter提供了日志級別之外更細粒度的控制
5. Handler是用來處理日志輸出位置
6. Formatter是用來格式化LogRecord的