目录
[2.1 打印日志](#2.1 打印日志)
[2.2 日志格式](#2.2 日志格式)
[2.3 日志级别](#2.3 日志级别)
[2.4 日志配置](#2.4 日志配置)
[2.4.1 日志级别](#2.4.1 日志级别)
[2.4.2 日志持久化](#2.4.2 日志持久化)
[2.4.3 日志文件分割](#2.4.3 日志文件分割)
[2.4.4 配置日志格式](#2.4.4 配置日志格式)
[3.1 添加 lombok 依赖](#3.1 添加 lombok 依赖)
[3.2 输出日志](#3.2 输出日志)
一、日志概述
在SpringBoot项目启动后,项目本身就有默认的日志输出,即:
那么如何自己打印如上的日志呢?
二、日志使用
SpringBoot 内置了日志框架 Slf4j,可以直接在程序中调用 Slf4j 来输出日志。
2.1 打印日志
打印日志的步骤:
- 在程序中得到日志对象;
- 使用日志对象输出要打印的内容。
在程序中获取日志对象需要使用日志工厂LoggerFactory,如下代码所示:
java
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
Logger 对象是属于 org.slf4j 包下的,不要导入错包。
日志对象的打印方法有很多种,先使用 info() 方法来输出日志,如下代码所示:
java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoggerController {
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@PostConstruct
public String logger(){
logger.info("info 日志");
return "打印日志";
}
}
2.2 日志格式
从上图可以看到,日志输出内容元素具体如下:
①. 时间日期:精确到毫秒
②. 日志级别:ERROR, WARN, INFO, DEBUG 或TRACE
③. 进程ID
④. 线程名
⑤. Logger名(通常使用源代码的类名)
⑥. 日志内容
2.3 日志级别
日志的级别从高到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE。级别越高, 收到的消息越少。
- FATAL: 致命信息,表示需要立即被处理的系统级错误。
- ERROR: 错误信息, 级别较高的错误日志信息, 但仍然不影响系统的继续运行。
- WARN: 警告信息, 不影响使用, 但需要注意的问题。
- INFO: 普通信息, 用于记录应用程序正常运行时的一些信息, 例如系统启动完成、请求处理完成等。
- DEBUG: 调试信息, 需要调试时候的关键信息打印。
- TRACE: 追踪信息, 比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使同DEBUG级别替代)。
那么可以通过以下代码实现不同级别的日志打印:
java
/**
* 打印不同级别的⽇志
* @return
*/
@PostConstruct
public String printLog() {
logger.trace("================= trace ===============");
logger.debug("================= debug ===============");
logger.info("================= info ===============");
logger.warn("================= warn ===============");
logger.error("================= error ===============");
return "打印不同级别的⽇志" ;
}
结果发现, 只打印了info, warn和error级别的日志,这与日志级别的配置有关, 日志的输出级别默认是 info级别, 所以只会打印大于等于此级别的日志, 也就是info, warn和error。
2.4 日志配置
2.4.1 日志级别
日志级别配置只需要在配置文件中设置"logging.level"配置项即可。
在properties文件中:
java
logging.level.root=debug
在yml文件中:
java
logging:
level:
root: debug
配置完成之后,重新启动项目,运行上面代码,可发现:
2.4.2 日志持久化
以上的日志都是输出在控制台上的,然而在线上环境中需要把日志保存下来, 以便出现问题之后追溯问题。把日志保存下来就叫持久化。 日志持久化有两种方式:
- 配置日志文件名
- 配置日志的存储目录
-
配置日志文件的路径和文件名:
properties配置 :logging.file.name=springboot.log
yml配置 :
# 设置⽇志⽂件的⽂件名
logging:
file:
name: springboot.log
启动项目刷新之后会显示:
2. 配置日志文件的保存路径
properties配置
logging.file.path=D:/temp
yml配置:
# 设置⽇志⽂件的⽬录
logging:
file:
path: D:/temp
启动项目刷新之后会显示:
这种方式只能设置日志的路径, 文件名为固定的spring.log。
logging.file.name 和 logging.file.path 两个都配置的情况下, 只生效其一, 以 logging.file.name 为准。
2.4.3 日志文件分割
如果我们的日志都放在一个文件中, 随着项目的运行, 日志文件会越来越大, 需要对日志文件进行分割。 默认日志文件超过10M就进行分割。
配置项 | 说明 | 默认值 |
---|---|---|
http://logging.logback.rollingpolicy.file-name-pattern | 日志分割后的文件名格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
http://logging.logback.rollingpolicy.max-file-size | 日志文件超过这个大小就自动分割 | 10MB |
配置日志文件分割:
properties配置 :
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB
yml配置 :
logging:
logback:
rollingpolicy:
max-file-size: 1KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
日志文件超过1KB就分割,分割后的日志文件名为:日志名.日期.索引
项目运行, 多打印一些日志, 日志分割结果:
2.4.4 配置日志格式
目前日志打印的格式是默认的,打印日志的格式, 也是支持配置的,支持控制台和日志文件分别设置。
配置项 | 说明 | 默认值 |
---|---|---|
http://logging.pattern.console | 控制台日志格式 | %clr(%d{{LOG_DATEFORMAT_PATTERN:-yyyy-MM dd'T'HH:mm:ss.SSSXXX}}){faint} %clr({LOG_LEVEL_PATTERN:- %5p}) %clr({PID:- }){magenta} %clr(---){faint} %clr(\[%15.15t\]) {faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n{LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
http://logging.pattern.file | 日志文件 的日志格 式 | %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} {PID:- } --- \[%t\] %-40.40logger{39} : %m%n{LOG_EXCEPTION_CONVERSION_WORD:-%wEx} |
配置项说明:
-
%clr(表达式){颜色} 设置输入日志的颜色,支持颜色有:blue、cyan、faint、green、magenta 、red、yellow
-
%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间--精确到毫秒
-
%5p 显示日志级别ERROR,MARN,INFO,DEBUG,TRACE.
-
%t 线程名,%c 类的全限定名,%M method,%L 为行号,%thread 线程名称,%m 或者 %msg 显示输出消息,%n 换行符
-
%5 若字符长度小于5,则右边用空格填充,%-5 若字符长度小于5,则左边用空格填充. %.15 若字符长度超过15,截去多余字符,%15.15 若字符长度小于15,则右边用空格填充。 若字符长度超过15,截去多余字。
如果设置了颜色,但是没有生效,那么就需要配置。以下步骤进行配置即可:
"-Dspring.output.ansi.enabled=ALWAYS"
重新启动程序便可解决问题。
properties配置:logging.pattern.console='%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
yml配置:
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
三、更简单的日志输出
每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,,且每个类都添加一遍, lombok提供了一种更简单的方式。
- 添加 lombok 框架支持
- 使用 @slf4j 注解输出日志
3.1 添加 lombok 依赖
java
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
3.2 输出日志
java
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
@PostConstruct
public void log(){
log.info("--------------要输出⽇志的内容----------------");
}
}
运行结果如下: