SpringBoot学习笔记(四):SpringBoot中的日志
发布日期:2021-05-10 07:53:44 浏览次数:23 分类:精选文章

本文共 3994 字,大约阅读时间需要 13 分钟。

日志是什么?它是用来记录事件发生的组件。就像小时候我们写日记一样,在什么时刻做了什么事情,这样就方便了后面的查询工作。在项目的开发中,日志是必不可少的,常见的日志框架有很多,如: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。

引入依赖的包:

org.springframework.boot
spring-boot-starter-logging

编写程序:

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中加入如下配置:

org.springframework
spring-core
commons-logging
commons-logging

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中加入配置

%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n
%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n

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

spring.profiles.active=dev

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

上一篇:SpringBoot学习笔记(五):SpringBoot中的静态资源的映射规则
下一篇:SpringBoot学习笔记(三):SpringBoot的配置文件(2)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年04月29日 22时46分11秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章