Spring Boot 日志详解
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Spring Boot 日志
一、日志有什么用
日志是程序的重要组成部分。想象⼀下如果程序报错了不让你打开控制台查看⽇志那么你能找到报错的原因吗
答案是否定的写程序不是买彩票不能完全靠猜因此⽇志对于我们来说最主要的⽤途就是排除和定位问题。
除了发现和定位问题之外我们还可以通过⽇志实现以下功能
- 记录⽤户登录⽇志⽅便分析⽤户是正常登录还是恶意破解⽤户。
- 记录系统的操作⽇志⽅便数据恢复和定位操作⼈。
- 记录程序的执⾏时间⽅便为以后优化程序提供数据⽀持。
以上这些都是⽇志提供的⾮常实⽤的功能。
二、日志怎么用
Spring Boot 项⽬在启动的时候默认就有⽇志输出如下图所示
以上内容就是 Spring Boot 输出的控制台⽇志信息。
日志格式说明
通过上述⽇志信息我们能得到以下 一个结论 和 三个问题
- Spring Boot 内置了⽇志框架不然也输出不了⽇志。
- 默认情况下输出的⽇志并⾮是开发者定义和打印的那开发者怎么在程序中⾃定义打印⽇志呢
- ⽇志默认是打印在控制台上的⽽控制台的⽇志是不能被保存的那么怎么把⽇志永久的保存下来呢
- 日志打印级别默认为 INFO那么怎样改变日志打印级别来筛选和控制日志的内容呢
下⾯我们⼀起来寻找这些问题的答案 ~
三、自定义日志打印
开发者⾃定义打印⽇志的实现步骤
1得到日志对象
2使用日志对象提供的方法输出自定义的日志内容。
System.out.println(); 也算是打印了日志但是
a. 只有打印的内容没有其他相关信息比如打印的时间、打印的类 (出处)…
b. 不能实现不同环境下的行为控制 (设置日志打印级别)。
3.1 在程序中得到日志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory如下代码所示
// 1.得到日志对象
private static Logger log = LoggerFactory.getLogger(TestController.class);
日志工厂需要将每个类的类型传递进去这样我们才知道⽇志的归属类才能更⽅便、更直观的定位到问题类。
约定大于配置(注意事项)
- 参数只能设置为当前类的类对象。
- Logger 对象是属于 org.slf4j 包下的不要导入错包
因为 Spring Boot 中内置了⽇志框架 slf4j所以咱们可以直接在程序中调用 slf4j 来输出⽇志。
常⻅的⽇志框架说明了解
slf4j 就是一层通用的封装类似于 JDBC ~~
3.2 使用日志对象打印日志
⽇志对象的打印⽅法有很多种info、debug、warn… 如下代码所示
package com.example.demo;
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 TestLogging {
// 1.得到日志对象
private static Logger logger = LoggerFactory.getLogger(TestLogging.class);
@RequestMapping("/hello")
public void sayHi() {
// 2.使用日志对象提供的方法进行日志打印
logger.trace("Hello,i am trace.");
logger.debug("Hello,i am debug.");
logger.info("Hello,i am info.");
logger.warn("Hello,i am warn");
logger.error("Hello,i am error");
}
}
启动并运行通过 http://localhost:8080/hello 访问此时控制台打印出日志信息
为什么 trace() 和 debug() 的打印日志没有显示呢这与日志级别相关 ~~
四、日志级别
4.1 日志级别有什么用
- ⽇志级别可以帮你筛选出重要的信息⽐如设置⽇志级别为 error那么就可以只看程序的报错⽇志了对于普通的调试⽇志和业务⽇志就可以忽略了从⽽节省开发者信息筛选的时间。
- ⽇志级别可以控制不同环境下⼀个程序是否需要打印⽇志如开发环境我们需要很详细的信息而生产环境为了保证性能和安全性就会输入尽量少的日志而通过日志的级别就可以实现此需求。
4.2 日志级别的分类与使用
⽇志的级别分为
- trace踪迹的意思级别最低
- debug需要调试时候的关键信息打印
- info普通的打印信息默认⽇志级别
- warn警告不影响使用但需要注意的问题
- error错误信息级别较⾼的错误⽇志信息
- fatal致命的因为代码异常导致程序退出执行的事件。
⽇志级别的顺序
级别越高接收到的消息就越少如设置了 warn 就只能收到 warn、error、fatal 级别的日志了。
总共有 6 种级别打印的时候为什么只有 5 种而没有 fatal 呢
因为 fatal 是 “致命” 的只会在代码异常导致程序退出的时候才记录自己没法自定义 ~~
4.3 日志级别设置
日志的输出级别默认是 info。
在上面我们自定义了五个等级的打印日志却只看到了三个
这是因为此时是默认日志级别 info怎样进行日志级别设置呢
日志级别配置只需要在配置⽂件中设置 “logging.level” 配置项即可如下所示
logging:
level:
root: trace
这是配置跟路径的日志级别。
而日志级别的设置可以是非常精细的 (根据包)
logging:
level:
root: warn
com:
example:
demo: debug
重新启动运行此时再通过 http://localhost:8080/hello 访问
这样就可以自定义设置日志级别了 ~~
五、日志持久化
以上的⽇志都是输出在控制台上的然⽽在⽣产环境上咱们需要将⽇志保存下来以便出现问题之后追溯问题把⽇志保存下来的过程就叫做持久化。
想要将⽇志进⾏持久化只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。
5.1 配置文件名
# 设置⽇志⽂件的⽂件名
logging:
file:
name: C:\yyhjava_project\tmp\yyh.log
只指定文件名的话就是生成在项目的根路径 ~~
配置完成后启动并运行此时在 C:\yyhjava_project\tmp\ 路径下
就生成了 yyh.log 日志文件。打开它
此时通过 http://localhost:8080/hello 访问
得到结论日志是追加的不会覆盖 ~~
重新运行依然是追加
一直追加文件不是会特别大吗
并不是。当日志比较大的时候会自动分隔成多个文件。
5.2 配置保存路径
# 设置⽇志⽂件的⽬录
logging:
file:
path: C:\yyhjava_project\tmp\
配置完成后启动并运行此时在 C:\yyhjava_project\tmp\ 路径下
生成了 spring.log 日志文件 (默认文件名就是 spring.log)。
各种性质与文件名方式生成的一致 ~~
六、更简单的日志输出 – lombok
每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐且每个类都添加一遍也很麻烦这⾥讲一种更好⽤的⽇志输出⽅式使⽤ lombok 来更简单的输出。
1添加 lombok 框架支持
2使用 @slf4j 注解输出日志
6.1 添加 lombok 依赖
或者右击鼠标添加依赖
或者使用插件
6.2 输出日志
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
@RequestMapping("/p")
public class TestLogging {
@RequestMapping("/log")
public void loggerTest() {
log.error("------------------- error -----------------");
}
}
通过 http://localhost:8080/p/log 访问后查看控制台
也成功打印出了日志。
注意 使用 @Slf4j 注解在程序中使⽤ log 对象即可输入日志并且只能使⽤ log 对象才能输出这是 lombok 提供的对象名。
6.3 lombok 原理解释
lombok 能够打印日志的秘密就在 target ⽬录⾥⾯target 为项目最终执行的代码查看 target 目录如下
Java 程序的运行原理
Lombok 的作用如下图所示
6.4 lombok 更多注解说明
基本注解
注解 | 作用 |
---|---|
@Getter | ⾃动添加 getter ⽅法 |
@Setter | ⾃动添加 setter ⽅法 |
@ToString | ⾃动添加 toString ⽅法 |
@EqualsAndHashCode | ⾃动添加 equals 和 hashCode ⽅法 |
@NoArgsConstructor | ⾃动添加⽆参构造⽅法 |
@AllArgsConstructor | ⾃动添加全属性构造⽅法顺序按照属性的定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造⽅法final + @NonNull 的属性为必需 |
组合注解
注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |
日志注解
注解 | 作用 |
---|---|
@Slf4j | 添加⼀个名为 log 的⽇志使⽤ slf4j |