SpringBoot之日志框架

SpringBoot之日志框架

Scroll Down

前言

在java项目中,日志是必不可少的功能,日志对于快速定位问题,检查日常项目运行状态等有非常重要的作用。
市面上有很多常见的日志框架:JUL、JCL、jboss-logging、logback、log4j、log4j2、slf4j....
log4j: Apache基金会项目,日志实现框架
log4j2: 是log4j的升级产品,但是与log4j不兼容
CommonsLogging: 简称jcl,Apache基金会项目,日志门面组件
slf4j: 日志门面组件
logback: 日志实现框架
jul: java官方的日志实现框架

日志门面日志实现
JCL(jakarta Commons Logging)(最后一次更新是在2014年)、SLF4j(Simple Logging Facade for java)、jboss-logging(一般不用)Log4j、jul(java.util.logging)、log4j2、logback

到这里大家可能比较疑惑,记录日志到底该用那个组件,其实实现日志记录可以直接使用日志实现框架,比如logback、log4j、log4j2或者jul,但是一旦这么做如果碰到日志组件更换或者升级,将会很麻烦,比如你需要去每一个使用日志记录中的类中去修改。
所以我们的项目一般不直接使用日志实现框架,而是使用外观模式(门面模式)日志门面组件+桥接器+日志实现框架,这样即使项目更换日志种类,只需更换桥接器和和日志实现框架,也就是只更换jar包就可以了,代码无需做任何更改。
下图表示了日志门面组件、桥接器、日志实现框架之间的关系:
image.png

日志的选用

建议选择Slf4j+logback,相比其他组合有以下优势:
   1.限制较少适用范围更广
   2.更好的性能,更低的开销
   3.文档免费
   4.slf4j和logback是同一个人开发,衔接好
如果不想适用该组合,也可以选用其他组合,很多人也使用slf4j+log4j,这里吧slf4j和其他日志实现框架组合和所需要的的桥接器列出,可以自行选用:
image.png

另外,SpringBoot底层是Spring框架,Spring框架默认使用JCL;SpringBoot选用SLF4j+logback

SLF4j使用

1.如何在系统中使用SLF4j

以后再开发的时候,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层的方法,也就是日志门面。
要使用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包和logback的实现jar包,官网也给出了SLF4j对各种日志实现框架的说明
image.png

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

遗留问题

假如开发a系统用的slf4j+logback,Spring框架,Hibernate框架,MyBatis。。。。,但是每一个框架都有可能有一个日志框架,这样日志框架就要统一一下,即使是别的框架,也一起使用slf4j进行输出,那怎么实现这一操作呢?

在官网的legacyAPIs里也有一张图:
image.png

如何让系统中所有日志都统一到slf4j?
1.将系统中其他的日志框架先排除出去
2.用中间包替换原有的日志框架
3.使用slf4j其他的日志实现框架

SpringBoot日志关系

用idea右键pom文件有个Diagrams--show dependencies,可以以图表的形式查看依赖关系
image.png
image.png
SpringBoot用它来做日志功能:

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

image.png
结论:
1.SpringBoot底层也是使用slf4j+logback的方式进行日志记录
2.SpringBoot也把其他的日志都用中间替换包替换成了slf4j
3.如果我们要引入其他的框架,一定要把这个框架的默认日志移除掉
4.SpringBoot能自动适配所有的日志,而且底层使用slf4j+logback方式记录日志

日志的使用

1.#### 默认配置
SringBoot默认已经配置好了日志

@SpringBootTest
class SpringBoot01HalloworldQuickApplicationTests {

    //记录器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    void contextLoads() {
        //日志级别:
        //由低到高:trace<debug<info<warn<error
        logger.trace("这是trace日志。。。");
        logger.debug("这是debug日志。。。");
        logger.info("这是info日志,,,");
        logger.warn("这是warn日志。。");
        logger.error("这是error日志。。");
    }

}

SpringBoot的默认级别是info级别,修改级别只需要在配置文件里用logging.level.包名==级别进行修改
logging.level.com.mrdeer=trace

logging的其他常用配置:

不指定路径在当前项目下生成SpringBoot.log日志(可以直接指定路径)
logging.file=
logging.path设置日志路径
logging.pattern.console在控制台输出的日志格式
logging.file.console在文件中输出的日志格式