slf4j日志的使用原理
在开发期间,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层里面的方法;
因此,在使用SLF4j时,给系统里面导入slf4j的jar和logback的实现jar。
我们可以进入SLF4j的官网看一看:
另外,我们还能看到日志框架图:
每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架自己本身的配置文件;
日志种类繁多且比较混乱,因此很有必要统一日志记录,即使是别的框架,是否能统一使用slf4j进行输出?这样就只用写slf4j的配置文件了。
我们可以进官网详细看看:
如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去;
2、用中间包(狸猫换太子包)来替换原有的日志框架;
3、我们导入slf4j其他的实现
这个依赖是每个项目都有的:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>SpringBoot使用它来做日志功能:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>我们可以看看依赖图,进入pom文件右键
找到日志相关的依赖:
这就是底层的依赖关系:
1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录
2)、SpringBoot也把其他的日志都替换成了slf4j;
3)、中间替换包?
如果我们要引入其他框架?一定要把这个框架的默认日志依赖移除掉!
我们知道,Spring框架用的是commons-logging,那么SpringBoot应该就要把这个日志包移除掉,我们来看看:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>(不同版本之间可能会存在差异,莫纠结)
SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,需要注意的是,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉即可;
当我们启动一个刚创建的项目时,有日志输出,因此我们知道,SpringBoot默认帮我们配置好了日志;
日志的级别由低到高 :trace<debug<info<warn<error。可以调整输出的日志级别,日志就只会在这个级别以以后的高级别生效
SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别:root级别。
可以在控制台声明日志的格式,日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%n是换行符
例如形如:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
我们可以在具体项目中查看,例如我们查看一下logback,具体如下:
找到logback:
例如我们选择看base.xml文件,其中的resource来源于default.xml文件
我们进入default.xml文件:
其中就有对于控制台输出的日志的格式要求:
<propertyname="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>logging.path
不指定路径在当前项目下生成springboot.log日志
可以指定完整的路径;
logging.file=G:/springboot.log
在当前磁盘的根路径下创建spring文件夹和里面的log文件夹,使用 spring.log 作为默认文件
logging.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
给类路径下放上每个日志框架自己的配置文件即可,SpringBoot就不使用他默认配置的了
logback.xml:直接就被日志框架识别了;
logback-spring.xml:日志框架就不认识它了,因为只认识logback.xml,也就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能。否则就会报错!
例如,我们如果需要区分dev和非dev环境的日志输出,则我们需要在logback-spring.xml中添加如下信息:
即在不同环境下,日志输出格式有所不同
这个在自己最近接触的项目组pweb项目中有所接触
如何激活呢?
第一种方式:在配置文件application.properties中添加“spring.properties.active=dev”
第二种方式:在命令行中调整:
如果没有激活,即默认状态,则为:
--spring:properties.active=default