一.什么是日志框架
1.概念
- 一套能实现日志输出的工具包
- 能够表述系统运行状态的所有时间都可以算作日志
比如:System.out.println()语句就是一种最低级的日志
二.日志框架的选择
1.什么是日志门面和日志实现?
- 日志门面:是日志实现的抽象层。
- 日志实现:具体的日志功能的实现。
为什么不直接使用日志实现,而是又弄了一个叫日志门面的东西?
因为日志实现,可能会有一些代码的优化和改动,避免影响用户在项目中的使用,使用日志门面这些统一的接口,假设在实现层代码做了更改,用户在项目中使用日志而调用的接口等等都是不会受影响的。
2.常见的日志框架
日志门面(抽象层) | 日志实现 |
JCL SLF4j Jboss-logging | JUL log4j log4j2 logback |
在实际使用中,是选择一个抽象层的日志门面搭配一个底层日志实现来使用的。
SpringBoot中默认选择的搭配是:slf4j+logback
下面分别了解一下以上提到的各种门面和实现。
JCL:最后一次版本更新停在了2014年,后来没有继续维护更新,一般不考虑选用。
slf4j:这里提一下日志实现里面的log4j和logback,这两个实现和门面slf4j都是同一个人写的,他先写了log4j后,觉得性能可以再做优化,又写了logback,为了有更加适配的门面,自己又为log4j和logback量身打造了门面slf4j。所以这三者里面最优的搭配当然是slf4j+logback。
JUL:是java.util.logging包下提供的日志实现。
log4j2:在log4j问世之后,apache公司发现了日志市场,自家也开发了一款叫log4j2的产品。
3.日志的基本使用
导入依赖
<!--日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!--日志实现-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author panzhi
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class LoggerTest {
// private final Logger logger = LoggerFactory.getLogger(LoggerTest.class);
@Test
public void test1() {
// logger.debug("debug...");
// logger.info("info...");
// logger.error("error...");
String name="root";
String password="123456";
log.debug("debug...");
log.info("info...");
log.info("name:"+name+",password:"+password);
log.info("name:{},password:{}",name,password);
log.error("error...");
}
}
三.Logback的使用和配置
1.两种方式
- application.yml配置
# 日志格式
logging:
pattern:
console: "%d - %msg%n"
level: DEBUG
file:
path: 路径名
- logback-spring.xml方式
- 控制台日志
- 输出日志文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--控制台日志-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%d - %msg%n
</pattern>
</layout>
</appender>
<!--info日志-->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/路径/log/info.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<!--error日志-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%d - %msg%n
</pattern>
</encoder>
<!--滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--路径-->
<fileNamePattern>/路径/log/error.%d.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
2.logback小知识
- logback 读取的配置文件类型
- logback会依次读取以下类型配置文件
- logback.groovy
- logback-test.xml
- logback.xml
- 如果均不存在会采用默认配置
- logback会依次读取以下类型配置文件
- logback组件
- Logger 日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
- Appender 用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
- Layout 负责把事件转换成字符串,格式化的日志信息的输出。在logback中Layout对象被封装在encoder中。