日志技术

在没有接触到日志技术前,获取程序运行时的数据或状态,只能依靠System.out.println()这种方式,而这种方式的缺点很明显:

  • 只能在控制台中输出,如果控制台的信息过多,找到想要的输出结果不方便
  • 不便于扩展、维护,如果到了项目后期,不想要再输出信息,还需要手动去注释或删除代码

日志技术:用于记录应用程序的运行信息、状态信息、错误信息等等

日志技术的优势在于:

  1. 更方便的进行数据追踪
  2. 性能相比传统方式更好
  3. 可以通过输出日志文件,减少控制台信息
  4. 日志存在级别概念,可以通过控制日志级别而有目的的筛选信息

Java提供了官方的日志技术:JUL(java.util.logging)。配置相对简单,但不够灵活,性能较差,所以使用较少

目前流行的日志技术有

  • Log4j:提供了灵活的配置选项,支持多种输出目标。不过由于Logback的出现,现在使用的人数也在逐渐减少
  • Logback:基于Log4j升级而来,提供了更多的功能和配置选项,性能优于Log4j
  • Slf4j(Simple Logging Facade For Java):简单日志面门,提供了一套日志操作的标准接口及抽象类(也就是规范制定者),允许应用程序使用不同的底层日志框架

Logback快速入门

  • 准备工作:引入logback的依赖(Springboot项目中该依赖已传递)、配置文件logback.xml
  • 记录日志:定义日志记录对象Logger,记录日志

引入依赖:

1
2
3
4
5
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
<dependency>

定义日志对象:

1
private static final logger log = LoggerFactory.getLogger(类名.class);

定义日志对象相对来说比较繁琐,更方便的创建Logger对象可以通过@Slf4j这个注释来完成

示例:

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
package com.norlcyan;

import org.junit.jupiter.api.Test;
// import org.junit.platform.commons.logging.Logger; 注意不是这两个包
// import org.junit.platform.commons.logging.LoggerFactory;

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

@Slf4j
public class LogTest {
// private static final Logger log = LoggerFactory.getLogger(LogTest.class);

@Test
public void testLog() {
log.debug("开始计算");
int sum = 0;
int[] nums = {1, 5, 3, 2, 1, 4, 5, 4, 6, 7, 4, 34, 2, 34};
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
log.info("计算结果为:{}",sum);
log.debug("结束计算");
}
}

logback.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{50}: 最长50个字符(超出.切割) %msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>

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

Spring Boot 按以下顺序查找日志配置文件:

  • logback-spring.xml(推荐使用)
  • logback.xml
  • logback-spring.groovy
  • logback.groovy
  • application.properties 中的 logging 配置
  • application.yml 中的 logging 配置
  • 如果测试类没有启动SpringBoot服务,那么logback-spring.xml不会生效,此时要将配置名称改为logback.xml

Logback配置文件

  • 配置文件名:logback.xml
  • 该配置文件是对Logback日志框架输出的日志进行控制的,可以用来配置输出的格式、位置以及日志开关等
  • 常用的两种输出日志位置:控制台、系统文件
1
2
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">...</appender>
1
2
<!-- 系统文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">...</appender>
  • 开启日志(ALL)、关闭日志(OFF)
1
2
3
4
<root level="ALL">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>

Logback日志级别

  • 日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(级别由低到高):
日志级别 说明 记录方式
trace 追踪,记录程序运行轨迹【使用很少】 log.trace(“…”)
debug 调试,记录程序调试过程中的信息,实际应用中一般将其视为最低级别【使用较多】 log.debug(“…”)
info 记录一般信息,描述程序运行的关键时间,如:网络连接、IO操作等【使用较多】 log.info(“…”)
warn 警告信息,记录潜在有害的情况【使用较多】 log.warn(“…”)
error 错误信息【使用较多】 log.error(“…”)

可以在配置文件中,灵活的控制输出哪些类型的日志

1
2
3
4
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>

实际开发中,不推荐将日志等级设置为ALL或者trace。因为当后端服务启动时,过低的日志等级会出一堆无用的信息,导致真正需要获取的信息难以追踪到