Jul执行流程
- 初始化Logger对象
- LogManager加载logging.properties配置
- 添加Logger到LogManager
- 从单例LogManager获取Logger
- 设置Lvel,指定日志记录LogRecord
- Filter提供日志级别以外更细粒度的控制
- Handle是用来处理日志输出的位置
- Formatter是用来格式化LogRecord的
JUL java util logging 是java原生的日志框架。
Jul快速入门
@Test
public void julTest(){
//1.获取日志记录器对象
Logger logger = Logger.getLogger("com.example.javalog.jul");
//2.日志记录输出
logger.info("hello");
//通用方法进行日志记录
logger.log(Level.INFO, "日志级别是info,他是枚举类");
//通过占位符输出变量
String name = "hwz";
int age = 20;
logger.log(Level.INFO, "用户信息为:{0},{1}", new Object[]{name, age});
}
日志级别
OFF 下面所有日志级别关闭
SEVERE (highest value) 最高级别,出现错误时使用
WARNING 警告信息
INFO 消息信息
CONFIG 配置信息
FINE 下面三个是debug日志信息
FINER
FINEST (lowest value)
ALL 上面所有级别开启
@Test
public void levelTest(){
//1.获取日志记录器对象
Logger logger = Logger.getLogger("com.example.javalog.jul");
//2.日志记录输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
/*
7月 21, 2022 11:05:08 上午 com.example.javalog.jul levelTest
严重: severe
7月 21, 2022 11:05:08 上午 com.example.javalog.jul levelTest
警告: warning
7月 21, 2022 11:05:08 上午 com.example.javalog.jul levelTest
信息: info
*/
}
Jul默认的日志级别是info
自定义日志级别
//自定义日志级别
@Test
public void logConfigTest() throws IOException {
//1.获取日志记录器对象
Logger logger = Logger.getLogger("com.example.javalog.jul");
//关闭默认系统的配置
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 fileHandler = new FileHandler("C:\\Users\\hwz\\Desktop\\log\\jul.log");
//进行关联
fileHandler.setFormatter(simpleFormatter);
logger.addHandler(fileHandler); //日志记录对象可以添加多个处理对象
//2.日志记录输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
/**
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 严重: severe
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 警告: warning
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 信息: info
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 配置: config
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 详细: fine
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 较详细: finer
* 7月 21, 2022 12:17:28 下午 com.example.javalog.jul logConfigTest
* 非常详细: finest
*/
}
Logger对象的父子关系
//Logger对象的父子关系
@Test
public void logParentTest(){
Logger logger1 = Logger.getLogger("icu.weizhan");
Logger logger2 = Logger.getLogger("icu");
//测试 logger1是logger2的子对象
System.out.println(logger1.getParent() == logger2); //true
//logger2的父对象是LogManager$RootLogger 所有日志记录器的顶级父对象
System.out.println(logger2.getParent()+"\nname:"+ logger2.getParent().getName());
//关闭默认系统的配置
logger2.setUseParentHandlers(false);
//自定义配置日志级别
//创建consoleHandler 控制台日志输出
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");
logger1.config("config");
logger1.fine("fine");
logger1.finer("finer");
logger1.finest("finest");
/**
* true
* java.util.logging.LogManager$RootLogger@7f690630
* name:
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 严重: severe
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 警告: warning
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 信息: info
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 配置: config
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 详细: fine
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 较详细: finer
* 7月 21, 2022 12:53:41 下午 com.example.javalog.jul logParentTest
* 非常详细: finest
*/
}
logger1是logger2的子对象,所以logger1也会继承logger2的配置的日志级别
自定义配置文件方式
//自定义配置文件方式
@Test
public void propertiesLogTest() throws IOException {
//读取配置文件,通过类加载器
InputStream resourceAsStream = Jul.class.getClassLoader().getResourceAsStream("logging.properties");
//创建LogManager
LogManager logManager = LogManager.getLogManager();
//通过创建LogManager加载配置文件
logManager.readConfiguration(resourceAsStream);
Logger logger = Logger.getLogger("test");
//2.日志记录输出
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("icu.weizhan"); //自定义logger
//2.日志记录输出
logger2.severe("severe icu");
logger2.warning("warning icu");
logger2.info("info icu");
logger2.config("config icu");
logger2.fine("fine icu");
logger2.finer("finer icu");
logger2.finest("finest icu");
}
logging.properties文件
# RootLogger 顶级父元素默认处理器处理为ConsoleHandler,FileHandler
handlers= java.util.logging.FileHandler
# 日志级别
.level= ALL
# 自定义Logger使用
icu.weizhan.handlers = java.util.logging.ConsoleHandler
icu.weizhan.level = CONFIG
# 关闭默认配置
icu.weizhan.UseParentHandlers = false
# 日志文件存放位置
# 日志文件中日志最大条数
# 日志文件数量
java.util.logging.FileHandler.pattern = C:/Users/hwz/Desktop/log/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
# xml格式
java.util.logging.FileHandler.maxLocks = 100
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# 以追加的方式添加日志内容
java.util.logging.FileHandler.append = true
#向控制台输出的handler对象
#指定handler对象的日志级别
java.util.logging.ConsoleHandler.level = ALL
#指定handler对象的日志消息格式对象XMLFormatter
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