springboo日志框架之SLF4j和logback
1,如何系统使用slf4j
以后开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层的方法;给系统导入slf4j的jar包和logback的实现jar,slf4j调用方法志门面 logback是日志实现
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
调用slf4j的基本架构层。在slf4j的基础上可以调用其他日志框架;每一个日志的实现框架都有自己的配置文件,使用slf4j框架之后,配置文件,还是做成,日志实现框架的配置文件。
例如:slf4j是日
2,不同日志框架的统一
统一日志记录,即使不同的日志框架也能进行统一。
如何让系统中的所有日志都统一到slf4j
- 首先将系统中的其他日志都排除掉
- 使用中间包替换原有的日志框架
- 我们导入slf4j的其他实现
3,springboot的日志关系。
底层依赖关系
总结:
1),springboot底层也是使用slf4j+logback的方式进行日志记录
2),springboot也把其他的日志都替换成了slf4j;
3),中间替换包
4),如果我们要引入其他的日志框架,一定要把这个框架的默认日志依赖移除掉,如果不移除掉的话,两个相同的jar包就会产生冲突。
springboot能够自动适配所有的日志,而且底层使用lslf4j+logback的方式来记录日志,引入其他框架的时候,只需要把这个框架所依赖的日志框架排除掉。
4,日志使用
1,默认配置
springboot默认帮我们配置好了日志。
//日志的级别
//由低到高 trac<debug<info<warn<error
//当我们项目上线的时候,我们可以调整日志的级别来进行日志输出,
//日志只会再这个级别和更高的级别生效。
//springboot默认的使用的级别时 info级别
package com.zzuli.log.logging;
import org.junit.jupiter.api.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;
@RunWith(SpringRunner.class)
@SpringBootTest
class LoggingApplicationTests {
//记录日志的 记录器 参数 为getClass(),代表本类
Logger logger =LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
//日志的级别
//由低到高 trac<debug<info<warn<error
//当我们项目上线的时候,我们可以调整日志的级别来进行日志输出,
//日志只会再这个级别和更高的级别生效。
logger.trace("这是trac日志...");
logger.debug("这是debug日志...");
logger.info("这是info日志...");
logger.warn("这是warn日志...");
logger.error("这是error日志...");
}
}
运行测试结果
调整日志级别,指定范围(在application.properties配置文件中)
logging.level.com.zzuli.log=trace
指定日志文件输出的位置
logging.file.name 现在版本更新了,代表loggiing.file
使用logging.file.path
logging.level.com.zzuli.log=trace
#第一种方式
#指定日志输入位置
#不指定路径
#logging.file.name=springboot.log
#指定路径在硬盘中生成一个日志文件
#logging.file.name=D:/springboot.log
#第二种方式
#logging.file.path
#在当前磁盘的根目录下,创建一个spring文件和里面的文件夹里面的log文件夹,使用spring.log作为默认文件。
logging.file.path=/spring/log
#在控制台输出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
#指定文件在文件中的日志输出格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread]=== %-5level === %logger{50} === %msg%n
生成的文件路径
指定在控制台上输出信息的格式
2,指定配置
在类路径下放上每个日志框架自己的配置文件即可:然后springboot就不会使用默认配置的了
配置规则
文件放在了最后自取 logback.xml
logback.xml: 直接可以被日志框架识别了
logback-spring.xml:日志框架不直接加载到日志的配置项,由springboot解析管理,如果文件命不使用
logback-spring.xml,直接使用springProfile就会报错
logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件每隔1分钟,就检查更新 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义参数常量,便于后面直接用${name}来获取value值 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %logger{50} - %msg%n"/>
<!--<property name="log.filePath" value="${catalina.base}/logs/webapps"/>-->
<property name="log.filePath" value="D:/logs/webapps"/>
<property name="log.maxHistory" value="30"/>
<!-- ch.qos.logback.core.ConsoleAppender 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- 过去使用layout,现在都推荐使用encoder
作用一:将日志信息转换(格式化)为字符串
作用二:然后写入到文件中-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- ch.qos.logback.core.rolling.RollingFileAppender 文件日志输出到文件 -->
<!-- 1.打印debug级别日志的设置 -->
<appender name="debugAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 例如当天,也就是今天是2020-2-10,那么在这天生成的日志文件路径为${log.filePath}/debug.log
接着到了明天,也就是2019-2-11,这天生成的日志文件路径为${log.filePath}/debug.log,
但昨天2020-2-10,生成的日志文件路径就变为${log.filePath}/debug/debug-2020-2-10.log.gz(压缩文件) -->
<!-- 当天生成的日志文件的路径 -->
<file>${log.filePath}/debug.log</file>
<!-- 设置基于时间(每天)的滚动策略,也就是将日志内容按照日期来写入到相应的文件中-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 当天之前的每天生成的日志文件的路径 -->
<fileNamePattern>${log.filePath}/debug/debug-%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 最大历史保存文件的数量,只保存最近30天的日志文件,超出的会被删除-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- 过去使用layout,现在都推荐使用encoder
作用一:将日志信息转换(格式化)为字符串
作用二:然后写入到文件中-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤掉非debug级别的信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<!-- 作用是拒绝写入所有与<level>不匹配的日志信息,
也就是非debug级别的日志信息都不会被写入到日志文件中 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.打印info级别日志的设置 -->
<appender name="infoAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 当天生成的日志文件的路径 -->
<file>${log.filePath}/info.log</file>
<!-- 设置基于时间(每天)的滚动策略,也就是将日志内容按照日期来写入到相应的文件中-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 当天之前的每天生成的日志文件的路径 -->
<fileNamePattern>${log.filePath}/info/info-%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 最大历史保存文件的数量,只保存最近30天的日志文件,超出的会被删除-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- 过去使用layout,现在都推荐使用encoder
作用一:将日志信息转换(格式化)为字符串
作用二:然后写入到文件中-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤掉非info级别的信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<!-- 作用是拒绝写入所有与<level>不匹配的日志信息,
也就是非info级别的日志信息都不会被写入到日志文件中 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 3.打印error级别日志的设置 -->
<appender name="errorAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 当天生成的日志文件的路径 -->
<file>${log.filePath}/error.log</file>
<!-- 设置基于时间(每天)的滚动策略,也就是将日志内容按照日期来写入到相应的文件中-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 当天之前的每天生成的日志文件的路径 -->
<fileNamePattern>${log.filePath}/error/error-%d{yyyy-MM-dd}.log.gz
</fileNamePattern>
<!-- 最大历史保存文件的数量,只保存最近30天的日志文件,超出的会被删除-->
<maxHistory>${log.maxHistory}</maxHistory>
</rollingPolicy>
<!-- 过去使用layout,现在都推荐使用encoder
作用一:将日志信息转换(格式化)为字符串
作用二:然后写入到文件中-->
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<!-- 过滤掉非error级别的信息 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<!-- 作用是拒绝写入所有与<level>不匹配的日志信息,
也就是非error级别的日志信息都不会被写入到日志文件中 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 监听com.paopaoedu.springboot包下所有类产生的日志信息
不设置additivity属性,那么默认additivity = true,表示会继承父级(在这里它的父级只有root一个),
也就是会将日志信息也输出在控制台,但级别会覆盖父级的级别,也就是在控制台会输出debug级别及以上的日志信息 -->
<logger name="com.paopaoedu.springboot" level="debug">
<!-- 表示按照debugAppender的设置去打印日志 -->
<appender-ref ref="debugAppender"/>
<!-- 表示按照infoAppender的设置去打印日志 -->
<appender-ref ref="infoAppender"/>
<!-- 表示按照errorAppender的设置去打印日志 -->
<appender-ref ref="errorAppender"/>
</logger>
<!-- 也是一种<logger>,是所有<logger>的父级 -->
<!-- 不设置additivity属性,或者设置additivity = true的<logger>,会继承root的子标签<appender-ref ref="console" />的设置,
将它自己设置的level属性级别及以上的日志打印到控制台 -->
<root level="info">
<!-- 表示按照console的设置去输出日志到控制台 -->
<appender-ref ref="console"/>
</root>
</configuration>
5,切换日志框架
例如:logback 日志框架切换成logback
首先打开pom.xml 右键打开生成树。
只需要导入一个依赖就可以了,他里面包含了 slf4j 和 log4j 两个依赖
<!-- 导入偷天换日的包, 要使用的日志依赖也不用加版本号,-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
6,springboot中显示sql日志
logging.level.com.包名=DEBUG
查看控制台结果