Java项目Spring技术Spring源码分析

三、SpringBoot日志

2019-04-18  本文已影响217人  木石前盟Caychen

1、日志框架

市面上的日志框架:

JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j...

日志门面(日志的抽象层) 日志的实现层
JCL(Jakarta Common logging)---Apache常用的common-loggingSLF4j(Simple Logging Facade for Java)、jboss-logging Log4jLog4j2JUL(java.util.logging)、Logback

Spring Boot底层是Spring框架,而Spring框架模式使用的是JCL

Spring Boot对日志框架进行了封装,选用 SLF4jLogback

2、SLF4j使用

2.1、如何在系统中使用SLF4j

注意点:以后在开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层的方法。

  1. 给项目中导入slf4j.jar和logback.jar。
  2. 使用slf4j进行日志记录。
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绑定到其他日志框架所需要的jar包.png

每一个日志的实现框架都有自己的配置文件。所以即使使用了slf4j以后,配置文件还是日志实现框架的配置文件。例如:sfl4j作为抽象层,log4j作为实现层,则需要使用log4j.properties或log4j.xml作为配置文件。

2.2、遗留问题

在一个大型的系统项目中,会运用到多种框架,比如Spring,Hibernate,Mybatis...,而每个框架的日志框架又不尽相同,既然如此,如何统一日志记录?

其他日志框架统一转换成slf4j.png

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

3、Spring Boot的日志框架

每一个Spring Boot应用都依赖于spring-boot-starter:

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

spring-boot-starter又依赖于spring-boot-starter-logging:

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

所以Spring Boot的底层依赖关系:


Spring Boot应用的日志架构.png

总结:
1)、Spring Boot底层使用的是slf4j+logback的方式进行日志记录;
2)、Spring Boot也把其他的日志替换成了slf4j,并把Spring底层的commons-logging移除掉了:

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

​ 3)、同时Spring Boot导入中间替换包,替换包的包名其实跟原来的包名一样,做了进一步的封装,并在内部使用slf4j:

public abstract class LogFactory {
    //内部使用的是SLF4JLogFactory
    static LogFactory logFactory = new SLF4JLogFactory();
}

​ 4)、如果要引入其他的框架?一定要把这个框架的默认日志依赖移除掉!,Spring Boot能够自动适配所有的日志框架,而且底层使用slf4j+logback的方式进行日志的记录,所以再引入其他框架的时候,只需要把这个框架所依赖的日志框架排除掉。

4、日志使用

4.1、默认配置

Spring Boot默认已经配置好了日志,可以直接使用SLF4J里的LoggerFactory:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBoot03LoggingApplicationTests {

    //日志记录器
    Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    public void contextLoads() {
        //日志的级别:
        //由低到高:trace < debug < info < warn < error
        //可以调整输出的日志级别,日志就只会输出大于或等于当前设置的日志级别的所有日志信息
        logger.trace("这是trace日志");
        logger.debug("这是debug日志");

        //Spring Boot默认的日志级别是info
        logger.info("这是info日志");
        logger.warn("这是warn日志");
        logger.error("这是error日志");
    }
}

通过在配置文件中设置日志级别:

# 设置默认的root级别,即Spring Boot默认的日志级别
logging.level.root=debug

# 设置org.com.cay.spring.boot所在的包使用trace的日志级别,其他使用默认的
logging.level.org.com.cay.spring.boot=trace

其他配置项:

# 在当前项目下生成springboot.log日志文件,也可以使用绝对路径
logging.file=springboot.log

# 在当前磁盘的根路径下创建spring文件夹以及里面的log文件夹,并使用默认的spring.log作为日志文件名
logging.path=/spring/log/
logging.file logging.path Example Description
(none) (none) 只在控制台输出
指定文件名 (none) my.log 输出日志到my.log文件中
(none) 指定目录 /var/log 输出日志到指定目录下的spring.log文件中

日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符

4.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

Spring Boot提供给日志框架高级Profile特性:

springProfile标签可以根据当前环境的profile来动态切换日志的配置项,而springProfile可以在logback的配置文件的configuration根标签下任何地方使用,多个profile使用逗号分隔开。

<configuration>
    <springProfile name="dev">
        <!-- 当前是dev环境时使用如下配置 -->
    </springProfile>
    <springProfile name="!dev">
        <!-- 当前不是dev环境时使用如下配置 -->
    </springProfile>
    <springProfile name="staging, prod">
        <!-- 当前环境是staging或者prod时使用如下配置 -->
    </springProfile>
</configuration>

注意:如果使用logback.xml作为配置文件名,而在里面使用了springProfile标签,则会报错。

5、切换日志框架

可以按照slf4j的日志适配图,进行相关的切换。

举例:slf4j+logback切换成slf4j+log4j

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>

spring-boot-starter-logging切换成spring-boot-starter-log4j2

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
上一篇下一篇

猜你喜欢

热点阅读