- 日志
- JUL
- log4j
在 Java 日志框架的生态中,存在多种的日志实现框架。例如说:
-
JUL
Java 自带 java.util.logging 组件的简称
-
Apache Log4j1
-
Apache Log4j2
-
Logback
那么,对于 Spring、Hibernate 等框架,会有打日志的需求,那么就需要选择相应的日志框架。但是,它们无论选择任一一个日志框架,可能使用 Spring、Hibernate 等框架的项目,希望选择另外一个日志框架。此时,项目中就需要添加多个日志框架的配置文件,十分麻烦不便
所幸,在 Java 日志框架的生态中,存在多种日志门面框架,基于 Facade Pattern 设计模式的思想,提供通用的日志 API 给调用方,而自己去实现不同日志框架的适配。例如说:
-
SLF4J
Simple Logging Facade for Java
-
JCL
Apache Commons Logging
-
jboss-logging
这样就变成,Spring 采用 JCL 日志门面框架,Hibernate 采用 jboss-logging 日志门面框架,而将选择具体的日志实现框架的权利,交给使用者
当然,也有框架,是自己实现简单的日志门面功能。例如说:
- Dubbo logger 组件
- MyBatis logging 组件
在 ==Spring Boot ,保持和 Spring 一致,采用 JCL 日志门面框架来记录日志
- Loggers记录日志
- Appenders(Handlers)日志输出,文件、控制台等
- Layouts日志排版`
- Level日志级别`
- Filters过滤
DemoApplicationTests是某个类名
public static final Logger LOGGER = Logger.getLogger("DemoApplicationTests");
@Test
public void testJUL() {
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setFormatter(new SimpleFormatter());
consoleHandler.setLevel(Level.ALL);
LOGGER.addHandler(consoleHandler);
LOGGER.setLevel(Level.ALL); // 加入等级为info,则只能打印info及以上等级,info warning 和 severe
LOGGER.severe("严重");
LOGGER.warning("警告");
LOGGER.info("信息");
LOGGER.fine("详细");
LOGGER.finer("较详细");
LOGGER.finest("非常详细");
FileHandler fileHandler = new FileHandler("D:\logs\test.log", true); // 与ConsoleHandler类似
}
getLogger()里面的参数使用某个具体的类,可以构建父子关系
比如 com.example 和 com.example.demo,此时前者是后者的父类,子类logger可以继承父类logger的配置,java里面有一个RootLogger
并且 每一个logger都是单例的
独立的配置文件
@Test
public void testJUL() throws Exception {
LogManager manager = LogManager.getLogManager();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("logging.properties");
manager.readConfiguration(in);
Logger logger = Logger.getLogger(DemoApplicationTests.class.getName());
logger.info("info");
}
过滤器
consoleHandler.setFilter(logRecord -> logRecord.getMessage().contains("好"));
LOGGER.info("信息好");
LOGGER.warning("警告");
// 表示 带有 "好" 就会打印日志,当然 这里只是举个简单的例子而已
log4j


