1、JUL 简介

JUL 全称 Java Util Logging,位于java.util.logging.Logger 包。它是 java 原生的日志框架,使用时无需另外引用第三方的类库,相对其他的框架使用方便,学习简单,主要是使用在小型应用中。

2、JUL 组件介绍

Logger

  • 记录器,应用程序通过获取 Logger 对象,调用其 API 来发布日志信息。Logger 通常被认为是访问日志系统的入口程序

Handler

  • 处理器,每个 Logger 都会关联一个或者是一组 Handler,Logger 会将日志交给关联的 Handler 去做处理,由 Handler 负责将日志做记录 Handler 具体实现了日志的输出位置,比如可以输出到控制台或文件中等等

Filter

  • 过滤器,根据需要定制哪些信息会被记录,哪些信息会被略过

Formatter

  • 格式化组件,它负责对日志中的数据和信息进行转换和格式化,所以它决定了我们输出日志最终的形式

Level

  • 日志的输出级别,每条日志消息都有一个关联的级别。根据输出级别的设置,用来展现最终所呈现的日志信息。根据不同的需求,去设置不同的级别

3、JUL 入门案例

① 新建普通 Java 项目

② 创建测试类,路径:src / com / jul / test / JULTest.java

代码示例

package com.jul.test;

import org.junit.Test;

import java.util.logging.Level;
import java.util.logging.Logger; // 日志入口程序:java.util.logging.Logger
public class JULTest { // JUL入门案例
@Test
public void test01() {
// 引入当前类的全路径字符串获取日志记录器
Logger logger = Logger.getLogger("com.jul.test.JULTest"); // 对于日志的输出有两种方式
// 1、直接调用日志级别的相关方法,方法中传递日志输出信息
logger.info("输出info信息1"); // 2、调用 log 方法,通过 Level 类型定义日志级别参数,以及搭配日志输出信息的参数
logger.log(Level.INFO, "输出info信息2"); System.out.println("--------"); // 打印日志信息并传参
// 输出学生信息:姓名、年龄
String name = "张三";
int age = 23;
logger.log(Level.INFO, "方式一:学生姓名:" + name + ",学生年龄:" + age); // 以上操作中,对于输出消息用字符串拼接弊端很多。拼接麻烦、程序效率低、可读性不强、维护成本高
// 应该使用动态生成数据的方式生产日志,就是占位符的方式来进行操作
logger.log(Level.INFO, "方式二:学生姓名:{0},学生年龄:{1}", new Object[]{name, age});
}
}

运行结果

六月 14, 2021 10:14:37 下午 com.jul.test.JULTest test01
信息: 输出info信息1
六月 14, 2021 10:14:37 下午 com.jul.test.JULTest test01
--------
信息: 输出info信息2
六月 14, 2021 10:14:37 下午 com.jul.test.JULTest test01
信息: 方式一:学生姓名:张三,学生年龄:23
六月 14, 2021 10:14:37 下午 com.jul.test.JULTest test01
信息: 方式二:学生姓名:张三,学生年龄:23

4、JUL 日志级别说明及展示

日志级别 数值 说明
OFF Integer.MAX_VALUE 关闭所有消息的日志记录
SEVERE 1000 错误信息(最高级的日志级别)
WARNING 900 警告信息
INFO 800 默认信息(默认级别)
CONFIG 700 配置信息
FINE 500 详细信息(少)
FINER 400 详细信息(中)
FINEST 300 详细信息(多)(最低级的日志级别)
ALL Integer.MIN_VALUE 启用所有消息的日志记录

这个数值的意义在于,设置的日志级别是 INFO 级别 - 800 时,则最终展现的日志信息,必须是数值大于 800 的所有级别信息

代码示例

// JUL日志级别说明及展示
@Test
public void test02() {
// 获取日志记录器
Logger logger = Logger.getLogger("com.jul.test.JULTest");
// 设置日志级别为配置级别
logger.setLevel(Level.CONFIG);
// 输出日志信息
logger.severe("severe:错误信息");
logger.warning("warning:警告信息");
logger.info("info:默认信息");
logger.config("config:配置信息");
logger.fine("fine:详细信息(少)");
logger.finer("finer:详细信息(中)");
logger.finest("finest:详细信息(多)");
}

运行结果

  • 通过打印结果看到只输出了 INFO 级别以及比 INFO 级别高的日志信息,而比 INFO 级别低的日志信息没有打印,说明 INFO 级别的日志信息是系统默认的日志级别
  • 仅通过以上形式来设置日志级别是不够的,还需要搭配处理器 handler 共同设置才会生效
六月 14, 2021 10:17:53 下午 com.jul.test.JULTest test02
严重: severe:错误信息
六月 14, 2021 10:17:53 下午 com.jul.test.JULTest test02
警告: warning:警告信息
六月 14, 2021 10:17:53 下午 com.jul.test.JULTest test02
信息: info:默认信息

5、JUL 自定义日志级别

代码示例

// JUL自定义日志级别
@Test
public void test03() {
// 获取日志记录器
Logger logger = Logger.getLogger("com.jul.test.JULTest");
// 将默认的日志打印方式关闭
// 参数设置为 false,打印日志的方式就不会按照父 logger 默认的方式去进行操作
logger.setUseParentHandlers(false);
// 控制台日志处理器
ConsoleHandler handler = new ConsoleHandler();
// 创建日志格式化组件对象
SimpleFormatter formatter = new SimpleFormatter();
// 在处理器中设置日志输出格式
handler.setFormatter(formatter);
// 在记录器中添加处理器
logger.addHandler(handler);
// 设置日志的打印级别
// 此处必须将日志记录器和处理器的级别进行统一的设置,才会达到日志显示相应级别的效果
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:详细信息(多)");
}

运行结果

六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
严重: severe:错误信息
六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
警告: warning:警告信息
六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
信息: info:默认信息
六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
配置: config:配置信息
六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
详细: fine:详细信息(少)
六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
较详细: finer:详细信息(中)
六月 14, 2021 10:19:26 下午 com.jul.test.JULTest test04
非常详细: finest:详细信息(多)

6、JUL 日志打印到文件中

日志文件后缀为 *.log,在 src 目录下创建 JULTest.log 日志文件

代码示例

    // JUL日志打印到文件中,将日志输出到具体的磁盘文件中相当于将日志做了持久化操作
@Test
public void test04() throws IOException {
// 获取日志记录器
Logger logger = Logger.getLogger("com.jul.test.JULTest");
// 关闭父记录器打印方式
logger.setUseParentHandlers(false); // 文件日志处理器
FileHandler handler = new FileHandler("src\\JULTest.log"); // 指定输出的日志文件
SimpleFormatter formatter = new SimpleFormatter();
handler.setFormatter(formatter);
logger.addHandler(handler); // 统一设置日志的打印级别
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:详细信息(多)");
}

运行结果:此时控制台中并没有输出日志信息,打开 JULTest.log 文件,日志信息打印到文件中了

六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
严重: severe:错误信息
六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
警告: warning:警告信息
六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
信息: info:默认信息
六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
配置: config:配置信息
六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
详细: fine:详细信息(少)
六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
较详细: finer:详细信息(中)
六月 14, 2021 10:24:19 下午 com.jul.test.JULTest test05
非常详细: finest:详细信息(多)

7、JUL 同时添加多个处理器

用户使用 Logger 来进行日志的记录,使用 Handler 来进行日志的输出,Logger 可以持有多个处理器 Handler,

添加了哪些 Handler 对象,就相当于根据所添加的 Handler 将日志输出到指定的位置上。例如控制台、文件中...

在 src 目录下创建 JULTest2.log 日志文件

代码示例

// JUL 同时添加多个处理器
@Test
public void test05() throws IOException {
Logger logger = Logger.getLogger("com.jul.test.JULTest");
logger.setUseParentHandlers(false);
SimpleFormatter formatter = new SimpleFormatter(); // 文件日志处理器
FileHandler handler1 = new FileHandler("src\\JULTest2.log"); // 指定输出的日志文件
handler1.setFormatter(formatter);
logger.addHandler(handler1); // 记录器中添加了一个文件日志处理器 // 控制台日志处理器
ConsoleHandler handler2 = new ConsoleHandler();
handler2.setFormatter(formatter);
logger.addHandler(handler2); // 记录器中又添加了一个控制台日志处理器 // 统一设置日志的打印级别
logger.setLevel(Level.ALL);
handler1.setLevel(Level.ALL);
handler2.setLevel(Level.ALL); // 输出日志信息
logger.severe("severe:错误信息");
logger.warning("warning:警告信息");
logger.info("info:默认信息");
logger.config("config:配置信息");
logger.fine("fine:详细信息(少)");
logger.finer("finer:详细信息(中)");
logger.finest("finest:详细信息(多)");
}

运行结果

  • 控制台输出了日志信息

    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    严重: severe:错误信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    警告: warning:警告信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    信息: info:默认信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    配置: config:配置信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    详细: fine:详细信息(少)
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    较详细: finer:详细信息(中)
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    非常详细: finest:详细信息(多)
  • JULTest2.log 文件中也打印了日志信息

    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    严重: severe:错误信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    警告: warning:警告信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    信息: info:默认信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    配置: config:配置信息
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    详细: fine:详细信息(少)
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    较详细: finer:详细信息(中)
    六月 14, 2021 10:38:28 下午 com.jul.test.JULTest test05
    非常详细: finest:详细信息(多)

8、JUL 记录器的父子关系及作用

JUL 中 Logger 记录器之间是存在"父子"关系的,这种父子关系不是我们普遍认为的类之间的继承关系,关系是通过树状结构存储的

JUL 在初始化时会创建一个顶层 RootLogger 作为所有 Logger 的父 Logger,RootLogger 是 LogManager 的内部类,默认的名称为空串

以上的 RootLogger 对象作为树状结构的根节点存在的,将来自定义的父子关系通过路径来进行关联,父子关系同时也是节点之间的挂载关系

代码示例

// JUL Logger(记录器)的父子关系及作用
@Test
public void test06() {
// 创建两个 logger 对象,可以认为 logger1 是 logger2 的父亲
// RootLogger 是所有 logger 对象的顶层 logger,名称默认是一个空的字符串
Logger logger1 = Logger.getLogger("com.jul.test");
Logger logger2 = Logger.getLogger("com.jul.test.JULTest"); System.out.println(logger2.getParent() == logger1);
System.out.println("----"); System.out.println("logger1名称:" + logger1.getName() +
",\n父Logger名称:" + logger1.getParent().getName() +
",\n父Logger引用:" + logger1.getParent());
System.out.println("----"); System.out.println("logger2名称:" + logger2.getName() +
",\n父Logger名称:" + logger2.getParent().getName() +
",\n父Logger引用:" + logger2.getParent());
System.out.println("----"); // 父亲所做的设置,也能够同时作用于儿子
// 对 logger1 做日志打印相关的设置,然后我们使用 logger2 进行日志的打印
logger1.setUseParentHandlers(false); ConsoleHandler handler = new ConsoleHandler();
SimpleFormatter formatter = new SimpleFormatter();
handler.setFormatter(formatter);
logger1.addHandler(handler);
handler.setLevel(Level.ALL);
logger1.setLevel(Level.ALL); //儿子做打印
logger2.severe("severe:错误信息");
logger2.warning("warning:警告信息");
logger2.info("info:默认信息");
logger2.config("config:配置信息");
logger2.fine("fine:详细信息(少)");
logger2.finer("finer:详细信息(中)");
logger2.finest("finest:详细信息(多)");
}

运行结果

true
----
logger1名称:com.jul.test,
父Logger名称:,
父Logger引用:java.util.logging.LogManager$RootLogger@3b764bce
----
logger2名称:com.jul.test.JULTest,
父Logger名称:com.jul.test,
父Logger引用:java.util.logging.Logger@759ebb3d
----
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
严重: severe:错误信息
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
警告: warning:警告信息
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
信息: info:默认信息
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
配置: config:配置信息
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
详细: fine:详细信息(少)
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
较详细: finer:详细信息(中)
六月 14, 2021 10:41:40 下午 com.jul.test.JULTest test06
非常详细: finest:详细信息(多)

9、JUL 日志配置文件解析

以上所有的配置相关的操作,都是以 java 硬编码的形式进行的,我们可以使用配置文件,若没有指定自定义日志配置文件,则使用系统默认的日志配置文件

默认配置文件位置:jdk 安装目录下 \ jre \ lib \ logging.properties 文件

############################################################
# 默认日志记录配置文件
#
# 您可以通过使用java.util.logging.config.file系统属性指定文件名来使用不同的文件
# 例如 java -Djava.util.logging.config.file=myfile
############################################################ ############################################################
# 全局性质
############################################################ # RootLogger使用的处理器,在获取RootLogger对象时进行的设置
# 可在当前处理器类后,通过指定的英文逗号分隔,添加多个日志处理器
# 这些处理程序将在VM启动期间安装,请注意:这些类必须位于系统类路径上
# 默认情况下,只配置控制台处理程序,默认打印INFO和高于INFO级别消息
handlers = java.util.logging.ConsoleHandler # 要添加文件处理程序,请使用以下行(多个日志处理器)
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler # RootLogger 默认的全局日志记录级别
# 对于这种全局层面的任何特定配置,可以通过配置特定的水平来覆盖
# 如果不手动配置其它的日志级别,则默认输出下述配置的级别以及更高的级别
.level = INFO ############################################################
# 处理器指定属性,描述处理程序的特定配置信息
############################################################ # 文件处理器属性设置
# 默认输出的日志文件路径,位于用户的主目录中
# %h:当前用户系统的默认根路径,C:\用户\用户名\java0.log
# %u:指向默认输出的日志文件数量count,count=1,则:java0.log;count=2,则:java0.log,java1.log...
java.util.logging.FileHandler.pattern = %h/java%u.log
# 默认输出的日志文件大小(单位字节)
java.util.logging.FileHandler.limit = 50000
# 默认输出的日志文件数量
java.util.logging.FileHandler.count = 1
# 默认输出的日志文件格式(XML)
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # 控制台处理器属性设置
# 默认输出的日志级别
java.util.logging.ConsoleHandler.level = INFO
# 默认输出的日志格式(Simple)
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter # 示例以自定义简单的格式化器输出格式,以打印这样的单行日志消息:
# <level>: <log message> [<date/time>]
#
# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n ############################################################
# 配置特定属性,为每个记录器提供额外的控制
############################################################ # 例如:将日志级别设定到具体的某个包下
com.xyz.foo.level = SEVERE

精简后

############################################################
# 默认日志记录配置文件
############################################################
# 全局性质
############################################################ # 默认配置控制台处理程序,默认打印INFO和高于INFO级别信息
handlers=java.util.logging.ConsoleHandler
# 如果不手动配置其它的日志级别,则默认输出下述配置的级别以及更高的级别
.level = INFO ############################################################
# 处理器指定属性,描述处理程序的特定配置信息
############################################################ # 文件处理器属性设置
# 默认输出的日志文件路径,位于用户的主目录中
java.util.logging.FileHandler.pattern = %h/java%u.log
# 默认输出的日志文件大小(单位字节)
java.util.logging.FileHandler.limit = 50000
# 默认输出的日志文件数量
java.util.logging.FileHandler.count = 1
# 默认输出的日志文件格式(XML)
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter # 控制台处理器属性设置
# 默认输出的日志级别
java.util.logging.ConsoleHandler.level = INFO
# 默认输出的日志格式(Smiple)
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter ############################################################
# 配置特定属性,为每个记录器提供额外的控制
############################################################
# 例如:将日志级别设定到具体的某个包下
com.xyz.foo.level = SEVERE

10、JUL 使用自定义配置文件

在 src 目录下创建 logging.properties 日志配置文件,将 9 小节精简后的默认配置文件内容复制到 logging.properties 文件中

将第 10 行:.level = INFO 值改为 ALL

将第 28 行:java.util.logging.ConsoleHandler.level = INFO 值改为 ALL

代码示例

// JUL 使用自定义配置文件
@Test
public void test07() throws IOException {
// 读取自定义日志配置文件
InputStream input = new FileInputStream("src/logging.properties");
// 获取日志管理器
LogManager logManager = LogManager.getLogManager();
// 日志管理器读取自定义配置文件
logManager.readConfiguration(input);
// 日志记录器
Logger logger = Logger.getLogger("com.jul.test.JULTest");
// 输出日志信息
logger.severe("severe:错误信息");
logger.warning("warning:警告信息");
logger.info("info:默认信息");
logger.config("config:配置信息");
logger.fine("fine:详细信息(少)");
logger.finer("finer:详细信息(中)");
logger.finest("finest:详细信息(多)");
}

运行结果:此时控制台输出的日志使用的是我们自定义的日志配置文件,打印了所有级别日志信息

六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
严重: severe:错误信息
六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
警告: warning:警告信息
六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
信息: info:默认信息
六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
配置: config:配置信息
六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
详细: fine:详细信息(少)
六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
较详细: finer:详细信息(中)
六月 14, 2021 11:00:47 下午 com.jul.test.JULTest test07
非常详细: finest:详细信息(多)

11、JUL 自定义配置文件中的文件输出

修改 logging.properties 日志配置文件,在 11 行处添加自定义文件日志处理器的配置信息

# 自定义文件日志处理器
com.jul.test.handlers = java.util.logging.FileHandler
# 自定义输出的日志级别
com.jul.test.level = WARNING
# 屏蔽父记录器打印方式
com.jul.test.useParentHandlers = false

运行结果: C:\用户\用户名 目录下会有一个 java0.log 文件,打开文件发现日志格式为 XML 格式,这是因为 java.util.logging.FileHandler.formatter 指定的格式为 XMLFormatter

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2021-06-14T23:24:06</date>
<millis>1623684246017</millis>
<sequence>0</sequence>
<logger>com.jul.test.JULTest</logger>
<level>SEVERE</level>
<class>com.jul.test.JULTest</class>
<method>test07</method>
<thread>1</thread>
<message>severe:错误信息</message>
</record>
<record>
<date>2021-06-14T23:24:06</date>
<millis>1623684246022</millis>
<sequence>1</sequence>
<logger>com.jul.test.JULTest</logger>
<level>WARNING</level>
<class>com.jul.test.JULTest</class>
<method>test07</method>
<thread>1</thread>
<message>warning:警告信息</message>
</record>
</log>

配置修改:在 src 目录下创建 JULTest3.log 日志文件

# 指定输出日志内容的日志文件
java.util.logging.FileHandler.pattern = src\\JULTest3.log
# 将XML格式更改为Simple格式
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

运行结果: JULTest3.log 文件中内容

六月 14, 2021 11:28:58 下午 com.jul.test.JULTest test07
严重: severe:错误信息
六月 14, 2021 11:28:58 下午 com.jul.test.JULTest test07
警告: warning:警告信息

12、JUL 追加日志信息

test07() 方法执行多次,会发现每次输出的日志内容会将上次的内容覆盖掉,这明显是不太好

增加配置

# 默认输出的日志内容会覆盖上次输出的内容, 设为true改为追加
java.util.logging.FileHandler.append=true

多次运行 test07() 方法:发现 JULTest3.log 文件中内容并没有被覆盖,而是一直往后追加

六月 14, 2021 11:47:17 下午 com.jul.test.JULTest test07
严重: severe:错误信息
六月 14, 2021 11:47:17 下午 com.jul.test.JULTest test07
警告: warning:警告信息
六月 14, 2021 11:47:22 下午 com.jul.test.JULTest test07
严重: severe:错误信息
六月 14, 2021 11:47:22 下午 com.jul.test.JULTest test07
警告: warning:警告信息
六月 14, 2021 11:47:33 下午 com.jul.test.JULTest test07
严重: severe:错误信息
六月 14, 2021 11:47:33 下午 com.jul.test.JULTest test07
警告: warning:警告信息

13、JUL 框架操作流程总结

① 初始化 LogManager,LogManager 加载 logging.properties 配置文件,添加 Logger 到 LogManager

② 从单例的 LogManager 获取 Logger

③ Level 设置日志级别,在打印的过程中使用到了日志记录的 LogRecord 类

④ Filter 作为过滤器提供了日志级别之外更细粒度的控制

⑤ Handler 日志处理器,决定日志的输出格式,例如:XMLFormatter、SimpleFormatter;日志的输出位置,例如:控制台、文件...

⑥ Formatter 是用来格式化输出的日志内容

JUL 日志框架的更多相关文章

  1. 带你掌握Java各种日志框架

    一:日志基本概念及框架 1:什么是日志 Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug调试功能来跟踪解决Bug,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...

  2. 3.Java日志框架slf4j、jcl、jul、log4j1、log4j2、logback大总结

    一.slf4j.jcl.jul.log4j1.log4j2.logback JUL:JDK中的日志记录工具,也常称为JDKLog.jdk-logging. LOG4J1:一个具体的日志实现框架. LO ...

  3. Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)

    一.简介 JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面. 现在市面流行以 slf4j(Simp ...

  4. Java日志框架:SLF4J,Common-Logging,Log4J,Logback说明

    Log4j  Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等 ...

  5. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  6. java日志框架与日志系统

    日志框架:提供日志调用的接口,实际的日志输出委托给日志系统实现. JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等. SLF4j: ...

  7. 实现jul 日志重定向到 slf4j

    需求背景 jul 指的是java.util.logging,是 java 内置的日志模块,目前流行的Java日志组件还包括 jcl(common-logging).slf4j/log4j/logbac ...

  8. Java 日志框架终极教程

    概述 对于现代的 Java 应用程序来说,只要被部署到真实的生产环境,其日志的重要性就是不言而喻的,很难想象没有任何日志记录功能的应用程序被运行于生产环境中.日志 API 所能提供的功能是多种多样的, ...

  9. Java日志框架那些事儿

    文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...

随机推荐

  1. JNLP配置WIN10

    依据网友的反响和我自己的考查,发觉JNLP的情况是大多数网友的困惑之处,针对此问题小编给大总结整理了(关键此)的处理技巧,并对它进以加工改善,整理出JNLP的详细教程,只用你按照1:首先配置电脑的ja ...

  2. 【山外笔记-SVN命令】svn命令详解

    本文打印版文件下载地址 [山外笔记-SVN命令]svn命令详解-打印版.pdf 一.命令简介 svn命令用于Subversion命令行客户端,执行svn相关的操作. 二.命令语法 1.svn语法: ( ...

  3. Ansible_使用文件模块将修改文件复制到受管主机

    一.描述常用文件模块 1.常用文件模块 模块名称 模块说明 blockinfile 插入.更新或删除由可自定义标记线包围的多行文本块 copy 将文件从本地或远程计算机复制到受管主机上的某个位置.类似 ...

  4. Linux服务之nginx服务篇一(概念)

    nginx官网:http://nginx.org/ 一. nginx和apache的区别 Nginx: 1.轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源. 2.抗并发,ng ...

  5. JQuery 使用教程

    引言 JQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程.JQuery 拥有丰富的选择器,可以非常方便的获取和操作 DOM 元素,而在 JQuery 中所有选择 ...

  6. PHP常用函数记录

    1.mixed print_r(mixed $expression [,bool $return=false ]) 打印变量信息. 相关的函数还有var_dump().var_export() $re ...

  7. 痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种快速定位i.MXRT600板级设计ISP[2-0]启动模式引脚上电时序问题的方法. 我们知道恩智浦i.MXRT600是主打音频市场的 ...

  8. Django(38)mac安装redis

    安装redis 1.使用Homebrew安装Redis brew install redis 执行上述命令后出现以下内容,则成功安装 Download failed: https://mirrors. ...

  9. [leetcode] 72. 编辑距离(二维动态规划)

    72. 编辑距离 再次验证leetcode的评判机有问题啊!同样的代码,第一次提交超时,第二次提交就通过了! 此题用动态规划解决. 这题一开始还真难到我了,琢磨半天没有思路.于是乎去了网上喵了下题解看 ...

  10. OneFlow 并行特色

    OneFlow 并行特色 在 Consistent 与 Mirrored 视角中,已经知道 OneFlow 提供了 mirrored 与 consistent 两种看待分布式系统的视角,并且提前知道了 ...