**
一、常用日志框架
**
常用日志框架包括JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j等。其中JCL,SLF4J,Jboss-logging日志的抽象层,log4j、Log4j2、Logback、 JUL(java.util.logging)为日志实现框架。
spring框架默认使用commos-logging框架,springboot默认使用SLF4J+LogBack日志。
二、springboot+日志的使用
1、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");
}
}
1、虽然springboot默认使用SLF4J+LogBack,但是也可以使用其他的实现类框架进行日志操作。官方图示如下:
根据图示,SLF4J接口虽然不能直接通过log4j,jul等实现,但是可以添加一个中间适配器,使两者绑定。具体如图所示:
(1)、spring-boot-start-logging中,引入了jul和log4j 的适配器。
(2)、进入适配器,可以看到,转换适配器对上实现了SLF4J的接口,对下包含了调用的的是log4的方法,通过实现SLF4J和调用log4j,绕过了用log4j直接实现SLF4J的问题,从而实现了SLF4J和log4j的绑定。
3、但是各种框架默认的日志框架不同,例如Spring(commons-logging)、Hibernate(jboss-logging),此时springboot就需要对这些框架的日志进行统一整合。
如官方图所示,即在其他日志类接口中引入转换包,例如:log4j-over-slf4j。jar
。框架将系统中其他日志框架先排除出去,同时引入的这些转换包包含了原日志接口的所需的所有类,代替了原有框架,并使用SLF4J替换了原有组件。最后都转换成l了SLF4J.Api,实现了多种不同日志框架的统一整合。
注意:
SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,在引入其他框架时,必须将其默认的日志框架移除后,再导入中间转换包才可以生效。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
三、日志使用
1、日志等级
日志等级包括五个等级,trace
<debug
<info
<warn
<error
trace
:打印更多信息,最低的日志级别debug
:开发过程中打印一些运行信息info
:打印重要信息warn
:警告error
:错误
2、springboot修改日志默认配置
(1)设置日志默认级别
SpringBoot默认使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别,即root级别,但可以通过配置文件调整输出的日志级别,日志就只会在这个级别以以后的高级别生效。
logging.level.com.xx=trace//级别
(2)指定日志生成路径
如果不指定路径,就会在当前项目下生成springboot.log日志。如果什么都不配置则只会在控制台打印。
指定完整路径
logging.file.name=G:/springboot.log
在当前**磁盘**的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.file.path=/spring/log
(3)修改日志格式
# 在控制台输出的日志的格式
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
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
3、配置文件指定配置
(1)、给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了,配置文件命名格式如下:Logback
:logback-spring.xml
, logback-spring.groovy
, logback.xml
, logback.groovy
Log4j2
:log4j2-spring.xml
, log4j2.xml
JDK
:logging.properties
(2)、logback.xml与logback-spring.xml的区别
logback.xml:直接就被日志框架识别,这种情况下使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误
IllegalStateException: Logback configuration error detected:
logback-spring.xml:日志框架不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能
<layout class="ch.qos.logback.classic.PatternLayout">
在dev环境下使用这种配置格式
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
在非dev环境下使用这种配置格式
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
</springProfile>
四、日志框架切换
1、排除原框架的xxx-over-slf4j
依赖和logback-classic
依赖
2、加入需要框架的依赖。(建议使用默认配置)例:slf4j+log4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>