Ⅷ.Spring Boot与日志


  日志的使用包括日志门面(抽象层)和日志实现。我们在使用的时候只需要调用日志门面即可。我们这里选用日志门面(抽象层):slf4j和日志实现:logback来进行讲解。在日志使用的时候不用考虑日志实现,只需要考虑日志的实现就可以了


1.日志门面slf4j与日志实现logback的使用

在官网上,我们可以看到slf4j的使用,slf4j用户手册

1
2
3
4
5
6
7
8
9
10
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
//geilongger是获取记录器的东西,获取类的信息
logger.info("Hello World");
}
}

  slf4j和logback使用方法:
  在使用slf4j和logback时,需要在系统中导入slf4j的jar包和logback的实现jar。


2.日志门面slf4j与其他日志实现方法的使用

  如果想使用日志门面slf4j与其他日志实现的时候,可以参考官方给出的这张图片。

图片来源于slf4j的官方网站

  从图中可以看到,第二行绿色方框所代表是为日志门面slf4j,只要是使用使用slf4j,日志门面就一定不会改变。在第三行里,蓝色为日志实现,由于一些日志实现出现的时候比较早,没有考虑到slf4j的出生,所有要使用灰色的日志实现需要淡绿色的适应层来适应。在第四行里,是早于slf4j出现的日志实现。
  在第一列中,由于只使用日志门面而没有采用日志方法,则日志记录后输出到一个空的位置。正确的用法应该是第二列,日志使用日志门面后选择不同的日志实现进行输出。第三和第四咧都是使用早于slf4j出现的日志实现,所以需要有适应层的存在。第五列是使用slf4j提供的简单的日志实现。第六列是导入slf4j提供的没有什么操作的日志实现。
  每一个日志实现都有不同的配置文件,slf4j根据不同日志实现进行不同的配置。

3.转换其他日志门面统一为slf4j的方法

  由于不同的框架在使用日志文件时采用不同的日志门面,类似spring使用commons-logging的日志门面,hibernate使用jboss-logging,mybatis使用不一样的日志门面,所有需要统一为一个指定的日志门面。
  这里我们将不同的日志门面转化统一为slf4j。

图片来源于slf4j的官方网站

  首先先注意左上角的子图,在左边的一个竖列是正常使用的slf4j和logback的方式。在右侧的那些方框是指使用了别的日志门面的方式。如果直接想替换成slf4j的方式的话,需要把依赖删除后,加入方框左下角提醒的jar,尚硅谷的雷丰阳老师称为偷天换日包,狸猫换太子包,也就是两个不同的包,前者有什么类,后者也有相同的类名,这样子就不会出错了。后者也有相同的类指向slf4j,再由slf4j指向日志实现。   右上角的子图和左下角的子图都是在使用优先slf4j出现之前的日志实现时需要要做的事情,其实跟上者没什么区别,只是在日志门面与日志实现之间增加了一个适应层而已。

4.日志实战使用

  springboot的日志在项目创建的时候就已经自动配置好了。下列展示日常中常用的日志的使用方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.myblog.springboot;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

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


Logger logger = LoggerFactory.getLogger(getClass());//创建日志记录的记录器
@Test
public void contextLoads() {
//System.out.println();

//日志的级别;trace<debug<info<warn<error
logger.trace("我是trace日志...");//跟踪信息时使用
logger.debug("我是debug日志...");//调试时使用
logger.info("我是info日志...");//自己定义的信息
logger.warn("我是warn日志...");//警告信息
logger.error("我是error日志...");//错误信息
//SpringBoot默认使用的是info级别的【也称为root级别】,也就是在输出日志的时候,不会输出trace和debug级别的信息。
//如果想设定级别,则可以在配置文件中使用logging.level来进行设置,类似设置我当前的包的级别为trace,则是如下所示
//logging.level.com.myblog=trace

//技巧:通过设置输入日志的级别,系统就只显示这个级别以上的日志信息,就不会一条条去注释日志语句了。
}
}

5.日志的配置

  上一节我们已经使用了日志的配置之一,也就是设置日志的输出等级,接下来说明logging.file和logging.path的区别,同样的,这两个的配置也是在配置文件中进行配置。

logging.file logging.path Example Description
(none) (none) 只在控制台输出
指定文件夹 (none) my.log 输出日志到my.log文件
(none) 指定目录 my.log 输出到指定目录的spring.log【名字是官方定义的】文件中

  如果logging.file和logging.path都没有指定的情况下,指定输出日志在工作台中。   如果是使用logging.file不使用logging.path的话,会在工程路径下生成指定名字的log文件【例如logging.file=springboot.log】,也可以通过指定路径的方式进行生成【例如logging.file=E:/springboot.log】   logging.file和logging.path是互相矛盾的,一般不混合使用,即使同时出现,也只会设置logging.file中的内容。logging.path里指定目录,而不考虑文件名,因为文件名是官方已经给出的名字【例如/spring/log,是指在工程所在的目录下新建spring文件夹,里再新建log文件夹,把日志文件写在spring.log并保存,注意/是绝对路径./是相对路径,在idea的工程里是看不到的,因为是工程同个目录下】