SpringBoot学习笔记(四):SpringBoot中的日志

日志是什么?它是用来记录事件发生的组件。就像小时候我们写日记一样,在什么时刻做了什么事情,这样就方便了后面的查询工作。在项目的开发中,日志是必不可少的,常见的日志框架有很多,如:JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback等等。

通常情况下,日志是由一个抽象层+实现层的组合来搭建的。如下:

日志-抽象层 日志-实现层
JCL、SLF4J、jboss-logging jul、log4j、log4j2、logback

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。当启动SpringBoot程序时,控制台输出如下:

 1、SLF4J的介绍

slf4j 是一个日志门面,具体的日志实现是由具体的日志框架实现的,比如 log4j、logback等日志框架。想要在程序中使用SLF4J,就需要导入SLF4J的jar 和Logback实现的jar。

引入依赖的包:

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

编写程序:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(LogTest.class);
        logger.info("success");
    }
}

结果如下: 

但是,Spring Boot项目一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging的依赖,所以,无需额外添加依赖。其关系图如下:

在SLF4J官网给出了一张图,其中对应着使用不同实现日志的流程图(现在好像找不到了):

假如需要使用log4j做日志记录,则可以按照上图中的流程引入相关jar包。

2、统一日志的实现

在系统开发中可能想使用 slf4j + logback 进行日志输出,但是我们系统依赖的 spring、mybatis 框架可能使用的是其他日志框架,那我们如何统一面向 slf4j 进行日志输出呢?SLF4J官网还有一张图,如下:

假如程序使用slf4+Logback的日志实现、其他框架又是别的日志框架实现,现在要统一日志实现有以下两种情况:

(1)正常流程

如果当前项目中没有使用其他框架,现在要使用slf4j+logging的日志框架,此时应该走如下流程:

(2)整合流程

假设现在的SpringBoot项目中有spring、mabtis等其他框架,我们知道spring使用的日志是commons,如图所示中,先将spring框架中的commons.logging.jar移除,然后导入jcl-over-slf4j.jar,这个jar包就会去找到slf4j-api.jar中的接口实现日志框架。MyBatis亦是如此,用log4j-over-slf4j.jar替换log4j.jar。

简单来说,实现日志统一的基本步骤如下:

a.将系统中其他日志框架先排除出去

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

c.导入slf4j其他的实现

如何从项目中移除不需要的依赖包?

以去除Spring框架的commons-logging为例,在pom.xml中加入如下配置:

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

3、SpringBoot中的日志配置

Spring Boot使用Logback记录日志,并用INFO级别输出到控制台,日志一般有以下5个级别,可以通过applicaiton.proerties文件中进行修改:

  • ERROR 错误信息
  • WARN 警告信息
  • INFO 一般信息
  • DEBUG 调试信息
  • TRACE 跟踪信息

它们的优先级由低到高:trace<debug<info<warn<error 。设置日志级别越高其他日志级别会被输出出来、设置低级别就只有低级别本身和比自己级别低的输出、高级别的不会被输出。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(LogTest.class);
        logger.trace("this is trace");
        logger.debug("this is debug");
        //SpringBoot的默认级别
        logger.info("this is info");
        logger.warn("this is warn");
        logger.error("this is error");
    }
}

application.properties文件关于日志记录的属性介绍:

(1)修改日志级别

root级别:即项目的所有日志

package级别:即指定包下使用相应的日志级别

示例:

#root级别
logging.level.root=info 
#package级别
logging.level.com.yht=error

如果我们给定日志级别为warn,则此时启动SpringBoot项目的输出如下:

 

 这个项目几乎没有输出内容,这是因为之前我们默认的级别是INFO,当设置为warn之后,info级别的信息就不会显示。

(2)将日志信息存储到文件

logging.path:该属性用来配置日志文件的路径

logging.file:该属性用来配置日志文件名,如果该属性不配置,默认文件名为spring.log

示例:

# 按照默认的名称spring.log,生成到指定路径及日志。
logging.path=output/logs
# 不指定的情况下默认生成在项目根目录,按照配置生成所需的日志名称
logging.file=D:/java/yht.log

(3)日志输出格式

默认输出的格式如下:

 示例:

# %d-时间格式、%thread-线程、%-5level-从左5字符宽度、%logger{50}-日志50个字符、%msg-信息、%n-换行
# 修改在控制台输出的日志格式
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{HH:mm:ss.SSS}——日志输出时间

%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用

%-5level——日志级别,并且使用5个字符靠左对齐

%logger- ——日志输出者的名字

%msg——日志消息

%n——平台的换行符

(4)logback-spring.xml的使用

logback.xml可以直接被日志框架识别。如果使用logback-spring.xml,日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot 的高级Profile功能。如果使用,直接将logback.xml或者logback-spring.xml在类路径下加入每个日志框架的配置文件即可。

1)在logback-spring.xml中加入配置

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <!--
    日志输出格式:
        %d表示日期时间,
        %thread表示线程名,
        %-5level:级别从左显示5个字符宽度
        %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
        %msg:日志消息,
        %n是换行符
    -->
    <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>
</appender>

2)在application.properties文件中配置激活dev开发环境

spring.profiles.active=dev

关于logback.xml和logback-spring.xml的详细配置可参考一下博客:

logback.xml常用配置详解 carway

logback-spring.xml配置文件

logback-spring.xml

猜你喜欢

转载自blog.csdn.net/weixin_47382783/article/details/114684656