Spring Boot笔记三:Spring Boot之日志

三、日志

1、日志框架

Spring Boot选用了SLF4j和 logback组合,SLF4j作为抽象层,logback作为实现层

2、 SLF4j使用

1、如何在系统使用SLF4j

对于日志记录方法的调用,应该调用日志抽象层里面的方法,而不是直接调用日志的实现类

系统首先导入slf4j的jar和 logback的实现jar

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以后,配置文件还是用日志实现类自己本身的配置文件

2、遗留问题

系统a(slf4j + logback) : Spring(commons-logging)、hibernate(jboss-logging).....

统一日志记录,即使是用了其他框架都用slf4j进行输出

如何让系统中的所有框架的日志都统一到slf4j:

  • 将系统中其他的日志框架先排除

  • 用中间包来替换原有的日志框架

  • 再用slf4j其他的实现

3、Spring Boot日志关系

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

Spring Boot使用它来做日志功能:

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.3.5.RELEASE</version>
      <scope>compile</scope>
</dependency>

底层依赖关系:

总结:

  • SpringBoot底层也是使用了slf4j+logback的方式进行日志记录

  • SpringBoot也把其他的日志替换成slf4j

  • 中间包替换

  • 排除掉原来日志框架的依赖,spring里面没有commons-logging的依赖,用jcl替代了

SpringBoot能自动适配所有的日志,而且底层使用了slf4j+logback的日志记录方式,引入其他框架也自动转为这种记录方式

4、日志使用

1、默认配置

SpringBoot默认已经配置过了

@SpringBootTest
class SpringBoot03LoggingApplicationTests {
    // 记录器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    void contextLoads() {

        // 日志的级别
        // 由低到高 trace<debug<info<warn<error
        // 可以调整需要输出的日志级别,日志只会在本级别以上的进行输出
        logger.trace("这是trace日志。。。");
        logger.debug("这是debug日志。。。");
        // springBoot默认提供的info级别,root级别    
        logger.info("这是info日志");
        logger.warn("这是warn日志");
        logger.error("这是error日志");

    }

}

也可以更改级别,在全局配置文件中,也有其他的设置配置:

# 指定日志输出等级
logging.level.com.wiggin=trace
# 不指定路径在当前root目录下创建log日志
# 可以指定路径
#logging.file.name=G:/springboot.log


# 在当前磁盘下根目录下创建spring文件夹,再创建log文件夹,默认创建的文件名为spring.log
logging.file.path=/spring/log

# 指定控制台输出的格式
logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n

# 指定文件中输出的格式
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n

logback日志配置示例

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 日志输出编码 -->
        <Encoding>UTF-8</Encoding>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <!--格式化输出:%d表示日期,
                          %thread表示线程名,
                          %-5level:级别从左显示5个字符宽度
                          %msg:日志消息,%n是换行符 -->
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
            </pattern>
        </layout>
    </appender>
2、指定配置

给类路径下放上各种日志框架的配置文件,原来的spring boot日志配置文件就失效了:

Logging System Customization
Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

logback.xml直接就被日志框架识别了

logback-spring.xml:就不会别框架识别,直接被springboot识别,这样就可以使用特定功能

<springProfile name="staging">
    <!-- configuration to be enabled when the "staging" profile is active -->
    	<!--配置在staging环境下能够被执行-->
</springProfile>

<springProfile name="dev | staging">
    <!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>

<springProfile name="!production">
    <!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>

例如上面的logback日志在logback-spring.xml的配置下就能这样书写:

<layout class="ch.qos.logback.classic.PatternLayout">
 <springProfile name="dev">
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}->[%thread] %-5level %logger{50} - %msg%n</pattern>
 </springProfile>
 
 <springProfile name="!dev">
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}=>[%thread] %-5level %logger{50} - %msg%n</pattern>
 </springProfile>
</layout>

5、切换日志框架

可以在pom文件下生成关系图,通过去除其他的框架与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>logback-classic</artifactId>
                    <groupId>ch.qos.logback</groupId>
                </exclusion>    
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
            <version>1.3.2.RELEASE</version>
</dependency>
posted @ 2020-11-06 21:06  wigginess  阅读(122)  评论(0编辑  收藏  举报