JUL的使用
JUL全程Java Util Logging,它是java原生的日志框架,使用时不需要另外引入第三方的类库,相对于其他的框架使用方便,学习简单,主要是使用在小型应用中。
应用程序(Application)--运行->日志记录器(Logger)- 记录日志->日志处理器(Handler)--处理日志-->日志输出
其中(日志记录器)Logger和Handler(日志处理器)共有的组件(Filters)、日志格式化组件(Fomatters)和日志输出级别(Level)
Logger:被称为记录器,应用程序通过获取Logger对象,抵用其API来发布日志信息。Logger通常被认为是访问日志系统的入口程序。
Handler:处理器,每一个Logger都会关联一个或者是一组Handler,Logger会将日志交给关联的Handler去做处理,由Handler负责将日志做记录。Handler具体实现了日志的输出位置,比如你可以输出到控制台或者是文件夹中等等。
Filter:过滤器,根据需要定制哪些信息会被记录,哪些信息会被略过
Formatter:格式化组件,它负责对日志的数据和信息进行转换和格式化,所以它决定了我们输出日志最终的形式 。
Level:日志的输出级别,每条日志都有一个关联的级别,我们根据输出级别的设置,用来展现最终呈现的日志信息。根据不同的需求,去设置不同的级别。
写一个案列:
创建一个普通的Java项目就行
包名是公司名的倒写
入门案列
JUL打印日志信息动态传递数据
日志级别的说明:
/*
* 日志的级别(通过源码查看)
* SEVERE:错误---最高级别的日志级别
* WARNING---警告
* INFO:(默认级别)消息
* CONFIG:配置
* FINR:详细信息(少)
* FINER:详细信息(种)
* FINEST:详细信息(多)----最低的日志级别
*两个特殊的级别
* OFF 可用来关闭日志记录
* ALL 启动所有消息的日志记录
*
* 对于日志的级别,我们重点关注的是nue对象的时候的第二个参数是一个数值
* OFF Integer.MAX_VALUE 整形最大值
*
* SEVERE 1000
* WARNING 900
* ...
* ...
* FINEST 300
*
* ALL Integer.MIN_VALUE 整形最小值
* 这个数值的意义在于,如果我们设置的日志级别是INFO--800
* 那么最后输出的日志信息必须数值大于800的所有的日志信息
* SEVERE
* WARNING
* */
JUL默认级别源码打印效果:
/*
* 通过打印结果,可以看出只输出info级别及比info级别高的日志信息
* 比info级别低的日志信息没有输出出来
* 证明了info级别的日志信息是系统默认的日志信息
* 在默认日志级别info基础上打印比它更高的信息
* */
Logger logger = Logger.getLogger("com.xcuni.JUL.test");
logger.severe("severe信息");
logger.warning("warning信息");
logger.info("info信息");
logger.config("config信息");
logger.fine("fine信息");
logger.finer("finer信息");
logger.finest("finest信息+");
/*
* 如果只是通过以下形式来设置日志级别
* 那么不能起到效果
* 将来更要搭配处理器Handler公共设置才会生效
* */
logger.setLevel(Level.CONFIG);
/*
JUL自定义日志级别
*/
@Test
public void test03(){
/*
* 自定义日志的级别
* */
//日志记录器
Logger logger = Logger.getLogger("com.xcuni.JUL.test");
//将默认的日志打印方式关闭掉
//参数设置为false,我们打印日志的方式就不会按照logger默认的方式去进行操作
logger.setUseParentHandlers(false);
//处理器Handler
//在此我们使用控制台日志处理器
ConsoleHandler handler = new ConsoleHandler();
//创建日志格式化组件对象
SimpleFormatter formatter = new SimpleFormatter();
//在处理器中设置输出格式
logger.addHandler(handler);
//设置日志的打印级别
//此处必须讲日志记录器和处理器进行统一处理,才会达到日志显示相应级别的效果
//logger.setLevel(Level.CONFIG);
//handler.setLevel(Level.CONFIG);
logger.setLevel(Level.ALL);
handler.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 test04(){
/*
* 将日志输出到具体的磁盘文件
* 这样做相当做了日志的持久化操作
* */
Logger logger = Logger.getLogger("com.xcuni.JUL.test");
logger.setUseParentHandlers(false);
//文件日志处理器
try {
FileHandler fileHandler = new FileHandler("D:\\myLogTest.log");
SimpleFormatter formatter = new SimpleFormatter();
fileHandler.setFormatter(formatter);
logger.addHandler(fileHandler);
logger.setLevel(Level.ALL);
fileHandler.setLevel(Level.ALL);
logger.severe("severe信息");
logger.warning("warning信息");
logger.info("info信息");
logger.config("config信息");
logger.fine("fine信息");
logger.finer("finer信息");
logger.finest("finest信息");
} catch (IOException e) {
e.printStackTrace();
}
}
日志添加多个处理类:
@Test
public void test04(){
/*
* 将日志输出到具体的磁盘文件
* 这样做相当做了日志的持久化操作
* */
Logger logger = Logger.getLogger("com.xcuni.JUL.test");
logger.setUseParentHandlers(false);
//文件日志处理器
try {
FileHandler fileHandler = new FileHandler("D:\\myLogTest.log");
SimpleFormatter formatter = new SimpleFormatter();
fileHandler.setFormatter(formatter);
logger.addHandler(fileHandler);
//又可以同时在控制台和文件中进行打印
ConsoleHandler handler = new ConsoleHandler();
handler.setFormatter(formatter);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
fileHandler.setLevel(Level.ALL);
handler.setLevel(Level.ALL);
logger.severe("severe信息");
logger.warning("warning信息");
logger.info("info信息");
logger.config("config信息");
logger.fine("fine信息");
logger.finer("finer信息");
logger.finest("finest信息");
/*
* 总结:
* 用户使用Logger‘来进行日志的记录,Logger可以有多个处理器Handler
* (日志的记录使用的是Logger,日志的输出 handler)
* 添加了哪些Handler对象就相当于需要所添加到handler
* 将日志输出到指定的位置上、例如控制台、文件.....
* */
} catch (IOException e) {
e.printStackTrace();
}
}
JULLogger的父子节点
@Test
public void test05(){
/*
*Logger之间的父子关系
* JUL中Logger之间是存在这种关系的
* 值得注意的是,这种父子关系不是我们认为普遍认为的类之间的继承关系
* 关系是通过树状态存储的
* */
/*
* 从下面创建的两个logger对象看来
* 我们可以认为logger1是logger2的父亲
* */
//父亲是RootLogger,名称默认是一个空的对象
//RootLogger可以被称为所有logger对象的顶层logger
Logger logger = Logger.getLogger("com.xcuni.JUL");
Logger logger1 = Logger.getLogger("com.xcuni.JUL.test");
Logger logger2 = Logger.getLogger("com.xcuni.JUL.test.JULTest");
// System.out.println(logger2.getParent()==logger1);//true
System.out.println("logger1的父Logger引用为:"
+logger1.getParent()+";名称为"+logger1.getName()+";父亲的名称为"+logger1.getParent().getName());
System.out.println("logger2的父Logger引用为:"
+logger2.getParent()+";名称为"+logger2.getName()+";父亲的名称为"+logger2.getParent().getName());
}
作用2
@Test
public void test05(){
/*
*Logger之间的父子关系
* JUL中Logger之间是存在这种关系的
* 值得注意的是,这种父子关系不是我们认为普遍认为的类之间的继承关系
* 关系是通过树状态存储的
* */
/*
* 从下面创建的两个logger对象看来
* 我们可以认为logger1是logger2的父亲
* */
//父亲是RootLogger,名称默认是一个空的对象
//RootLogger可以被称为所有logger对象的顶层logger
Logger logger = Logger.getLogger("com.xcuni.JUL");
Logger logger1 = Logger.getLogger("com.xcuni.JUL.test");
Logger logger2 = Logger.getLogger("com.xcuni.JUL.test.JULTest");
// System.out.println(logger2.getParent()==logger1);//true
System.out.println("logger1的父Logger引用为:"
+logger1.getParent()+";名称为"+logger1.getName()+";父亲的名称为"+logger1.getParent().getName());
System.out.println("logger2的父Logger引用为:"
+logger2.getParent()+";名称为"+logger2.getName()+";父亲的名称为"+logger2.getParent().getName());
/*
* 父亲所做的设置,也可以能够同时作于儿子
* 对于logger1做日志打印相关的设置,然后我们使用logger2进行日志的打印
* */
//父亲做设置
logger1.setUseParentHandlers(false);
ConsoleHandler handler = new ConsoleHandler();
SimpleFormatter formatter = new SimpleFormatter();
handler.setFormatter(formatter);
logger1.addHandler(handler);
logger1.setLevel(Level.ALL);
handler.setLevel(Level.ALL);
//儿子做设置
logger2.severe("severe信息");
logger2.warning("warning信息");
logger2.info("info信息");
logger2.config("config信息");
logger2.fine("fine信息");
logger2.finer("finer信息");
logger2.finest("finest信息");
}