springboot日志

3.18

目录

 

1.日志

2.SLFS4j的使用

   实现

   遗留问题

   3.springboot日志关系

   4.springboot默认配置

 

 

 

1.日志

日志门面(日志的抽象层) 日志实现

JCL(jakarta Commons Logging)SLF4j(Simple Logging Facade for Java) jboss-logging

Log4j JUL(iava.util.logging) Log4j2 Logback

左边选一个门面(抽象层),右边选择一个来实现

springboot:底层是spring框架,spring框架默认是JCL;springboot选用SFL4j和logback。

 

 

2.SLF4j的使用

以后开发,日志记录方法的调用不应该直接调用日志的实现类,而是调用日志抽象层里面的方法;给系统里面导入slf4j的jar和logback的实现jar

http://www.slf4j.org/manual.html

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的实现:

 

 

1.应用里只导了SLF4J的jar,进行日志的记录和调用,会输出到一个空的位置,因为没有任何实现。

2.应用里导入slf4j-api.jar和logback的jar包  调用slf4j的接口,用logback来实现。

3.应用里导入slf4j-api.jar、slf4j-log412.jar、log4j.jar

由于log4j出现的早于slf4j,设计时没考虑到slf4j的存在。为了让log4j也能符合slf4j的规范,需要中间的适配层slf4j-log412.jar。

适配层实现抽象层slf4j的具体方法,在适配层的方法里进行真正日志记录的时候调用log4j。

 

每一个日志的实现框架都有自己的配置文件。使用slf4j以后,配置文件还是做成日志实现框架的自己本身的配置文件。

  比如:用log4j的来做日志实现,就写log4j的配置文件;用logback来做日志实现,就写logback的配置文件。

 

遗留问题:项目中有 slf4j+logback、Spring(commons-logging)、Hibernate(jboss-logging)、Mybatis··· ···

目的:统一日志记录,即使是别的框架也统一使用slf4j进行输出。

方法:1.将系统中其他日志框架先排除出去,用中间包替换原有的日志框架

         用jcl-over-slf4j.jar替换commons-logging.jar

         用log4j-over-slf4j.jar替换log4j.jar

         用jul-to-slf4j.jar替换java.util.logging API

        2.导入slf4j其他的实现

 

 

 

 

3.springboot日志关系

springboot用它来使用日志功能

 

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>

 

 

 

 打开pom.xml 左键

 

 

 可以看到2.0版本的springboot底层依赖关系:

使用logback记录日志,把 jul-to-slf4j log4j-to-slf4j  日志框架转为slf4j

 

通过spring-jcl 将commons-logging 转换为slf4j

 

 

 

 

总结:

1.springboot底层也是使用slf4j+logback的方式进行日志记录

2.springboot也把其他的日志都替换成了slf4j

 

 

 

 

如果要引入其他框架,一定要把默认日志框架移除

spring框架用的是commons-logging,springboot能自动适配所有日志,而且底层使用slf4j+logback记录日志,引入其他框架只需要将这个框架引入的日志文件排除。

 

在1.x版本的springboot中可以看到:spring-core.pom已把commons-logging排除

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.3.20.RELEASE</version>
  <exclusions>
    <exclusion>
      <artifactId>commons-logging</artifactId>
      <groupId>commons-logging</groupId>
    </exclusion>
  </exclusions>
</dependency>

在2.0版本的springboot,转换器直接写到了jcl原本包里,jcl就是用slf4j

spring-core.pom

  <dependencies>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-to-slf4j</artifactId>
      <version>2.10.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>1.7.25</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

 

 

4.springboot默认配置

1.按springboot的默认配置输出日志

 @Test
    public void text(){
        //日志的级别 由低到高trace<debug<info<warn<error
        //可以调整输出的日志级别,日志就只会在这个级别以后的高级级别生效
        //springboot默认使用的是info级别的,所以只会输出info及以后的内容,也称root级别
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }

输出:

2020-03-18 19:09:47.607  INFO 18038 --- [           main] com.example.demo.DemoApplicationTests    : info
2020-03-18 19:09:47.607  WARN 18038 --- [           main] com.example.demo.DemoApplicationTests    : warn
2020-03-18 19:09:47.607 ERROR 18038 --- [           main] com.example.demo.DemoApplicationTests    : error

 

更改默认配置:

在application.properties中加入,将springboot的日志默认级别改为trace,则trace及级别大于trace的内容都可以输出

logging.level.com=trace

输出:

2020-03-18 21:02:44.968 TRACE 21636 --- [           main] com.example.demo.DemoApplicationTests    : trace
2020-03-18 21:02:44.968 DEBUG 21636 --- [           main] com.example.demo.DemoApplicationTests    : debug
2020-03-18 21:02:44.968  INFO 21636 --- [           main] com.example.demo.DemoApplicationTests    : info
2020-03-18 21:02:44.969  WARN 21636 --- [           main] com.example.demo.DemoApplicationTests    : warn
2020-03-18 21:02:44.969 ERROR 21636 --- [           main] com.example.demo.DemoApplicationTests    : error

 

建立springboot.log文档,在application.properties中加入:

#不指定路径在当前项目下生成spring.log,也可以指定完整路径
#2.2版本 生成日志
logging.file.path=/Users/mac/Desktop/springboot.log
#2.0版本可以用 2.2版本已过时
logging.file=springboot.log

springboot对于日志的默认配置可以看源码:org.springframework.boot.logging.logback

2.指定配置

给类路径下放上每个日志框架自己的配置文件(相关规则见官网)即可,springboot就不使用默认配置了

 

posted @ 2020-03-18 22:05  zuiaimiusi  阅读(281)  评论(0编辑  收藏  举报