2020-11-25 springboot和日志

**

一、常用日志框架

**
常用日志框架包括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,但是也可以使用其他的实现类框架进行日志操作。官方图示如下:
2020-11-25 springboot和日志
根据图示,SLF4J接口虽然不能直接通过log4j,jul等实现,但是可以添加一个中间适配器,使两者绑定。具体如图所示:
(1)、spring-boot-start-logging中,引入了jul和log4j 的适配器。
2020-11-25 springboot和日志

(2)、进入适配器,可以看到,转换适配器对上实现了SLF4J的接口,对下包含了调用的的是log4的方法,通过实现SLF4J和调用log4j,绕过了用log4j直接实现SLF4J的问题,从而实现了SLF4J和log4j的绑定。
2020-11-25 springboot和日志
2020-11-25 springboot和日志

3、但是各种框架默认的日志框架不同,例如Spring(commons-logging)、Hibernate(jboss-logging),此时springboot就需要对这些框架的日志进行统一整合。

2020-11-25 springboot和日志
2020-11-25 springboot和日志

如官方图所示,即在其他日志类接口中引入转换包,例如:log4j-over-slf4j。jar。框架将系统中其他日志框架先排除出去,同时引入的这些转换包包含了原日志接口的所需的所有类,代替了原有框架,并使用SLF4J替换了原有组件。最后都转换成l了SLF4J.Api,实现了多种不同日志框架的统一整合。
2020-11-25 springboot和日志

注意:

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>

参考文档:https://www.slf4j.org

三、日志使用

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就不使用他默认配置的了,配置文件命名格式如下:
Logbacklogback-spring.xml, logback-spring.groovy, logback.xmllogback.groovy
Log4j2log4j2-spring.xmllog4j2.xml
JDKlogging.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>

上一篇:SpringBoot整合Logback日志框架配置全解析


下一篇:logback-spring.xml配置