SpringBoot(三) LogBack 日志组件

Logback是一个优秀的企业应用程序的日志框架——它是快速,简单但强大的配置选项,有一个小的内存占用。

企业级项目在搭建的时候,最不可或缺的一部分就是日志,日志可以用来调试程序,打印运行日志以及错误信息方便于我们后期对系统的维护,在SpringBoot兴起之前记录日志最出色的莫过于log4j了,对于目前来说项目还有很多在用log4j来记录日志。

目标

学习SpringBoot项目中使用LogBack记录日志到控制台和文件之中,根据不同的级别输出不同形式日志信息。

构建项目

因为SpringBoot内部集成了LogBack所以我们不需要添加任何依赖,我们只需要创建一个新的项目即可。


我们创建项目是选择的WAR类型,所以自动添加了WEB、Tomcat。这个对我们的讲解无关紧要,因为SpringBoot有默认的配置所以我们并不需要添加任何操作,现在日志就可以在控制台打印了。
Spring Boot中默认配置ERROR、WARN和INFO级别的日志输出到控制台。
等级由低到高:debug<info<warn<Error

项目测试

为了证实这一点,我们先来创建一个IndexController然后添加一个访问方法/index,在该方法内添加日志的info级别的打印(默认配置只有Info及以上级别才可以输出)

IndexController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @author Ray
* @date 2018/7/22 0022
*/
@RestController
public class IndexController {

/**
* logback
*/
private final static Logger LOGGER = LoggerFactory.getLogger(IndexController.class);

/**
* http://localhost:8080/index
*/
@RequestMapping("/index")
public String index(){
LOGGER.info("访问了index方法");
return "index";
}
}

下面我们来启动项目,访问地址http://localhost:8080/index,查看控制台的输出效果:

我们访问地址后,控制台就对应的输出了info级别的测试日志内容了,上面我们说了这是logback的默认配置搞的鬼,那么我们该如何修改默认配置呢?

修改LogBack配置

LogBack读取配置文件的步骤
(1)尝试classpath下查找文件logback-test.xml
(2)如果文件不存在,尝试查找logback.xml
(3)如果两个文件都不存在,LogBack用BasicConfiguration自动对自己进行最小化配置,这样既实现了上面我们不需要添加任何配置就可以输出到控制台日志信息。

logback.xml

接下来我们在resources目录下创建名叫logback.xml的文件,并且添加日志配置输出到文件内按天存储到不同的文件之中

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
33
34
35
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="./logs" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>

我们在logback.xml配置文件中,添加了控制台输出、文件每天输出、日志文件最大上限、日志的最低级别等。下面我们来运行下项目查看我们的配置是否起作用了。

测试LogBack

1
2
3
4
5
6
7
8
9
10
/**
* http://localhost:8080/index
*/
@RequestMapping("/index")
public String index(){
LOGGER.debug("记录debug日志");
LOGGER.info("访问了index方法");
LOGGER.error("记录error日志");
return "index";
}

我们logback.xml配置文件配置了根输出等级是INFO,所以如果logback.xml生效,那么我们的控制台以及文件内将不会存在Debug级别的日志输出,我们重启下项目,访问地址http://localhost:8080/index
查看控制台的输出效果:

日志信息文件:

我们配置的./logs作为日志的输出根目录,所以LogBack自动在我们的项目根目录下创建名叫做logs的文件夹,并且项目启动时第一次记录日志时会自动创建根据我们的命名方式的文件。

屏蔽记录日志

如果我们在项目中需要屏蔽某个或者多个包下不输出日志也不记录日志到文件内,那么我们需要修改application.yml添加对应配置

application.yml

1
2
3
logging:
level:
com.ray.springboot203.controller: 'off'

可以看到我们屏蔽了com.ray.springboot203.controller包下的日志打印,
为了方便测试我们在controller包上一级目录创建一个名叫TestController 的控制器并复制IndexController 的内容

TestController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @author Ray
* @date 2018/7/22 0022
*/
@RestController
public class TestController {

/**
* logback
*/
private final static Logger LOGGER = LoggerFactory.getLogger(TestController.class);

/**
* http://localhost:8080/test
*/
@RequestMapping("/test")
public String index(){
LOGGER.debug("记录debug日志");
LOGGER.info("访问了test方法");
LOGGER.error("记录error日志");
return "test";
}
}

我们重启下项目
访问地址http://localhost:8080/index
控制台没有日志信息输出。

访问地址http://localhost:8080/test
控制台有日志信息输出。

可以看到成功打印了日志,证明了我们的配置已经生效了。当然也可以改变某个包下的日志输出等级,只需要将'OFF'改成对应等级即可。

日志内容说明

1
2
2018-07-22 14:44:30.247 [http-nio-8080-exec-9] INFO  com.ray.springboot203.TestController - 访问了test方法  
2018-07-22 14:44:30.247 [http-nio-8080-exec-9] ERROR com.ray.springboot203.TestController - 记录error日志

(1)时间日期:精确到毫秒
(2)日志级别:ERROR, WARN, INFO, DEBUG or TRACE
(3)进程ID
(4)分隔符:— 标识实际日志的开始
(5)线程名:方括号括起来(可能会截断控制台输出)
(6)Logger名:通常使用源代码的类名
(7)日志内容

总结

主要讲解了SpringBoot如何使用内置的日志组件完成日志的输出、日志保存到文件、控制日志输出等。

-------------- 本文结束  感谢您的阅读 --------------