当前位置:网站首页>JUL 学习
JUL 学习
2022-07-29 14:56:00 【悠然予夏】
JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。
1、JUL入门
1.1、架构介绍
- Loggers:被称为记录器,应用程序通过获取Logger对象,调用其API来来发布日志信息。Logger通常时应用程序访问日志系统的入口程序。
- Appenders:也被称为Handlers,每个Logger都会关联一组Handlers,Logger会将日志交给关联Handlers处理,由Handlers负责将日志做记录。Handlers在此是一个抽象,其具体的实现决定了日志记录的位置可以是控制台、文件、网络上的其他日志服务或操作系统日志等。
- Layouts:也被称为Formatters,它负责对日志事件中的数据进行转换和格式化。Layouts决定了数据在一条日志记录中的最终形式。
- Level:每条日志消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,我可以将Level和Loggers,Appenders做关联以便于我们过滤消息。
- Filters:过滤器,根据需要定制哪些信息会被记录,哪些信息会被放过。
总结一下就是:
用户使用Logger来进行日志记录,Logger持有若干个Handler,日志的输出操作是由Handler完成的。在Handler在输出日志前,会经过Filter的过滤,判断哪些日志级别过滤放行哪些拦截,andler会将日志内容输出到指定位置(日志文件、控制台等)。Handler在输出日志时会使用Layout,将输出内容进行排版。
1.2、入门案例
public class JULTest {
@Test
public void testQuick() throws Exception {
// 1.创建日志记录器对象
Logger logger = Logger.getLogger("com.itheima.log.JULTest");
// 2.日志记录输出
logger.info("hello jul");
// 通用方法进行日志记录
logger.log(Level.INFO, "info msg");
// 通过占位符方式输出变量值
String name = "jack";
Integer age = 18;
logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});
}
}
2、日志的级别
jul中定义的日志级别
* java.util.logging.Level中定义了日志的级别:
SEVERE(最高值)
WARNING
INFO (默认级别)
CONFIG
FINE
FINER
FINEST(最低值)
* 还有两个特殊的级别:
OFF,可用来关闭日志记录。
ALL,启用所有消息的日志记录。
虽然我们测试了7个日志级别但是默认只实现info以上的级别
@Test
public void testLogLevel() throws Exception {
// 1.获取日志对象
Logger logger = Logger.getLogger("com.itheima.log.QuickTest");
// 2.日志记录输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("cofnig");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
自定义日志级别配置
@Test
public void testLogConfig() throws Exception {
// 1.创建日志记录器对象
Logger logger = Logger.getLogger("com.itheima.log.JULTest");
// 一、自定义日志级别
// a.关闭系统默认配置
logger.setUseParentHandlers(false);
// b.创建handler对象
ConsoleHandler consoleHandler = new ConsoleHandler();// 输出到控制台
// c.创建formatter对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.进行关联
consoleHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
// e.设置日志级别
logger.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
// 二、输出到日志文件
FileHandler fileHandler = new FileHandler("d:/logs/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");
}
3、Logger之间的父子关系
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。
@Test
public void testLogParent() throws Exception {
// 日志记录器对象父子关系
Logger logger1 = Logger.getLogger("com.itheima.log");
Logger logger2 = Logger.getLogger("com.itheima");
System.out.println(logger1.getParent() == logger2);
// 所有日志记录器对象的顶级父元素 class为java.util.logging.LogManager$RootLogger name为""
System.out.println("logger2 parent:" + logger2.getParent() + ",name:" + logger2.getParent().getName());
// 一、自定义日志级别
// a.关闭系统默认配置
logger2.setUseParentHandlers(false);
// b.创建handler对象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.创建formatter对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.进行关联
consoleHandler.setFormatter(simpleFormatter);
logger2.addHandler(consoleHandler);
// e.设置日志级别
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");
}
4、日志的配置文件
默认配置文件路径$JAVAHOME\jre\lib\logging.properties
@Test
public void testProperties() throws Exception {
// 读取自定义配置文件
InputStream in = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
// 获取日志管理器对象
LogManager logManager = LogManager.getLogManager();
// 通过日志管理器加载配置文件
logManager.readConfiguration(in);
Logger logger = Logger.getLogger("com.itheima.log.JULTest");
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
配置文件:
## RootLogger使用的处理器(获取时设置)
handlers= java.util.logging.ConsoleHandler
# RootLogger日志等级
.level= INFO
## 自定义Logger
com.itheima.handlers= java.util.logging.FileHandler
# 自定义Logger日志等级
com.itheima.level= INFO
# 忽略父日志设置
com.itheima.useParentHandlers=false
## 控制台处理器
# 输出日志级别
java.util.logging.ConsoleHandler.level = INFO
# 输出日志格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# 指定handler对象的字符集
java.util.logging.ConsoleHandler.encoding=UTF-8
## 文件处理器
# 输出日志级别
java.util.logging.FileHandler.level=INFO
# 输出日志格式
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# 输出日志文件路径
java.util.logging.FileHandler.pattern = /java%u.log
java.util.logging.FileHandler.limit = 50000
# 输出日志文件限制个数
java.util.logging.FileHandler.count = 10
# 输出日志文件 是否是追加
java.util.logging.FileHandler.append=true
5、日志原理解析
- 初始化LogManager
- LogManager加载logging.properties配置
- 添加Logger到LogManager
- 从单例LogManager获取Logger
- 设置级别Level,并指定日志记录LogRecord
- Filter提供了日志级别之外更细粒度的控制
- Handler是用来处理日志输出位置
- Formatter是用来格式化LogRecord的
边栏推荐
- 极市直播丨严彬-Unicorn:走向目标跟踪的大一统(ECCV2022 Oral)
- Instant Messaging - New Software that Changes Social and Work Status
- 怎么建立数据分析思维
- 基于JSP&Servlet实现的众筹平台系统
- Learning Policies for Adaptive Tracking with Deep Feature Cascades全文翻译
- Couldn‘t create temporary file /tmp/apt.conf.uko4Kd for passing config to apt-key
- dedecms编辑器支持pdf导入
- CSP:重庆八中宏帆初级中学校新初二编程社C2024liuyanjia暑假一期集训总结(2/6))
- 数据分析的重要性
- [yolov7 series two] positive and negative sample allocation strategy
猜你喜欢
Generate Class bytecode files with Asm
MySQL Index Common Interview Questions (2022 Edition)
我裁完兄弟们后,辞职了,转行做了一名小职员
使用Xshell和Xftp7跑学校服务器记录
LeetCode·3.无重复字符的最长子串·滑动窗口
从通信延伸到全行业,亚信科技AntDB 7.0蓄势待发
QT通过UDP分包传输大图像(测试可传6M)
又一位AI大佬辞职进体制内!AI的尽头是编制?
双非渣渣的上岸之路!备战60天,三战滴滴侥幸收获Offer
Realization of Online Chat System Based on SSM
随机推荐
论人生自动化
生鲜赛道溃败中存活的本来生活,纠结生存
兆骑科创海外高层次人才引进平台,企业项目对接,赛事活动路演
You need to know about the digital transformation of eight guiding principles
进入中国27年,又一美妆巨头要离场
KDD'22博士论文奖:清华裘捷中成亚洲高校首位获得者,斯坦福Rex Ying获WINNER奖
Uni drop-down selection menu function/lazy loading images
疫情之下的裁员浪潮,7点建议帮你斩获心仪offer
Learning Policies for Adaptive Tracking with Deep Feature Cascades全文翻译
NDK 系列(5):JNI 从入门到实践,爆肝万字详解!
【左连接】坑点
Instant Messaging - New Software that Changes Social and Work Status
【 LeetCode 】 566. Reshape the matrix
【 LeetCode 】 1. The sum of two Numbers
【Try to Hack】IDS入侵检测系统
微服务实战|集中配置中心Config非对称加密与安全管理
自定义fingerprint特征
ArcGIS Pro与ArcGis区别
正斜杠 “/” 与反斜杠 “\”辨析
NLP自然语言处理-机器学习和自然语言处理介绍(三)