SpringBoot整合Slf4j+logback日志框架
1、介绍
Slf4j的全称是Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已。所以单独的Slf4j是不能工作的,必须搭配其他具体的日志实现方案,比如apache的org.apache.log4j.Logger,jdk自带的java.util.logging.Logger等。
2、优势
- 解耦客户端
Slf4j只是一种接口,它本身并不关心你底层使用的是什么日志实现方案,所以它支持各种日志实现方案。简单的说,只要我们在类库中使用Slf4j打日志,那么底层使用什么日志实现方案是使用者决定的,怎么决定?依靠配置文件和jar库。
- 提高效率
Slf4j打印日志使用了{}占位符,这样就不会有字符串拼接操作,减少了无用ring对象的数量,节省了内存,也提高了时间效率,同时编码更加方便。
3、log 等级
Slf4j有四个级别的log level可供选择,级别从上到下由低到高,优先级高的将被打印出来。
- Debug
简单来说,对程序调试有利的信息都可以debug输出 - info
对用户有用的信息 - warn
可能会导致错误的信息 - error
顾名思义,发生错误的地方
4、SpringBoot整合Slf4j+logback
logback和log4j以及log4j2三者,推荐使用logback,因为logback的效率显著高于log4j,而且logback也是Springboot推荐并且默认使用的日志系统。
springboot中包含了对应的jar包,所以不需要额外导包了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnMrvQuA-1615453911646)(image-20210311170809628.png)]
创建配置文件
在resource根目录下面创建配置文件 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
<!--
appender简介:
具体描述如何来写日志的节点。最常用的有三类:ConsoleAppender、FileAppender、RollingFileAppender
appender属性详解:
name属性:自定义名称。
class属性:指定类名。
appender子节点详解:
encoder子节点:将日志信息输出的节点,其内部的pattern子节点指定输出格式。
-->
<!--
ConsoleAppender简介:无特殊特性
-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>[%d{MM-dd HH:mm:ss}][%p][%logger{0}:%line] - %m%n</pattern>
</encoder>
</appender>
<!--
FileAppender简介:
把日志添加到文件。
FileAppender特殊子节点详解:
file子节点:日志文件名,相对路径绝对路径均可,如果上级目录不存在会自动创建,没有默认值。
append子节点:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
-->
<appender name="logFile" class="ch.qos.logback.core.FileAppender">
<file>logFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<!--
RollingFileAppender简介:
先将日志记录到指定文件,当符合某个条件时,将日志数据迁移到其他文件。
RollingFileAppender特殊子节点详解:
triggeringPolicy子节点:定义日志滚动的触发条件。一般为时间触发或文件大小触发。
rollingPolicy子节点:当触发条件满足时,决定如何滚动。涉及文件移动和重命名。
-->
<appender name="rollingFileBaseTime" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>rollingFileBaseTime.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<appender name="rollingFileBaseSize" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>rollingFileBaseSize.log</file>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>logFile.%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<!--
logger简介:
用来设置某个包或类的打印级别和appender。
logger属性详解:
name属性:用来指定受此logger约束的某一个包或者具体的某一个类。
level属性:设置打印级别,默认继承上级的级别。
addtivity属性:是否向上级loger传递打印信息,默认是true。
logger子节点详解:
appender-ref子节点:可以包含多个,用于引用appender节点
-->
<logger level="info" name="com.xxx.xxx">
<appender-ref ref="stdout" />
</logger>
<!--
root简介:
也是一个logger节点,但它是根logger节点,只有一个level属性
root属性详解:
level属性:设置打印级别,默认继承上级的级别。
root子节点详解:
appender-ref子节点:可以包含多个,用于引用appender节点
-->
<root level="info">
<appender-ref ref="stdout" />
</root>
</configuration>
在springboot配置文件application.yml中引入上面的配置文件
# 日志文件路径配置
logging:
config: classpath:logback.xml
使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-214cfNjD-1615453911648)(image-20210311171036506.png)]
private Logger logger = LoggerFactory.getLogger(this.getClass());
/***
* 用户登录
* @param user
* @return
*/
@PostMapping("/login")
public AjaxResult login(@RequestBody User user){
logger.error("用户{}登录,密码:{}",user.getUsername(),user.getPassword());
return new AjaxResult().ok(200,"成功了!" + user.getPassword());
}
ser){
logger.error(“用户{}登录,密码:{}”,user.getUsername(),user.getPassword());
return new AjaxResult().ok(200,“成功了!” + user.getPassword());
}