文章目录
- 一、日志的作用
- 二、如何在SpringBoot中使用日志
- 2.1、在程序中得到日志对象。
- 2.2、通过日志对象中提供的内置方法操打印日志信息
- 2.2.1 日志级别
- 2.2.1.1、日志级别有什么作用??
- 2.2.1.2、日志级别的分类
- 2.2.1.2、在配置文件中设置日志级别[!]
- 三、日志框架
- 四、日志的持久化[!]
- 4.1、配置文件中设置日志的保存路径
- 4.2、配置文件中设置日志的文件名
- 五、System.out.println vs 日志框架存在的缺点
- 六、更简单的日志输出——lombok
一、日志的作用
1、排除和定位问题
2、记录用户登录日志, 方便分析用户是正常登录还是恶意破解用户。
3、记录系统的操作日志,方便数据恢复和定位操作人。
4、记录程序的执行时间,方便为以后优化程序提供数据支持。
二、如何在SpringBoot中使用日志
SpringBoot启动时,就有日志在控制台输出:
Spring启动输出日志信息,说明:
1、SpringBoot内置了日志框架。
2、默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢??
3、日志信息默认打印在控制台上,但控制台的日志信息不能被保存,那怎么永久将日志信息保存下来??
那么程序员在SpringBoot中自定义打印日志需要:
2.1、在程序中得到日志对象。
LoggerFactory 来自 slf4j包,slf4j 就是SpringBoot中内置的日志框架。
private static Logger 1ogger = LoggerFactory. getLogger(UserController .class);
2.2、通过日志对象中提供的内置方法操打印日志信息
代码例子:
package com.example.testall.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 程序员自己自定义打印日志
*/
@Controller
@ResponseBody
@RequestMapping("/testlogger") //一级路由
public class testLogger {
// getLogger()的参数既可以是String又可以是类,参数表示的意思是:
// 当前的日志信息是来自哪个类。
// 1、得到日志对象
private static final Logger logger = LoggerFactory.getLogger(testLogger.class);
@RequestMapping("/hi") //二级路由
public String hi(){
// 2、通过日志对象中提供的内置方法操打印日志信息
logger.trace("我是 trace!");
logger.debug("我是调试日志!");
logger.info("我是 info");
logger.warn("我是 warn");
logger.error("我是 error");
return "Hi,SpringBoot!";
}
}
控制台运行结果:
但是为什么代码中写了5个日志打印,控制台却只输出打印3个日志信息??
2.2.1 日志级别
这与日志的级别有关! 日志进行打印时,只会打印当前设置的日志级别(SpringBoot默认的日志级别就是 info。)以及比当前日志级别更高的日志,低的日志就不打印了。[!]
就像工作中,你的领导可以给你安排工作,领导的领导同样也可以给你安排工作,因为对于你的领导来说,你的级别低,但是对于别的员工来说,你级别较高也是一个领导,此时级别比你低的员工就不能给你安排工作。
2.2.1.1、日志级别有什么作用??
1、通过日志级别能快速筛选出重要的信息,节省时间。 一般看控制台输出的日志信息时,不会全部日志级别都看,着重关注 warn(警告)、error(错误)这两个日志级别,也有可能只关注 error 日志。
2、不同环境实现不同日志级别设置的需求。可能开发环境下,需要着重关注详细信息,此时就需要很多日志打印的支持;而生产环境下为了保证性能与安全性,会尽量少的出现日志输出。
2.2.1.2、日志级别的分类
trace:微量、少许
debug:需调试时的关键信息打印
info:普通的打印信息(默认的日志级别)
warn:警告信息,不影响使用,但需要注意的问题
error:错误信息。级别较高
fatal:致命的,因为代码异常导致程序退出执行的事件(这个日志级别是没办法通过日志对象内置的方法来自定义输出的,因为这个日志级别对于程序来说是致命的,只有程序由于异常而退出时,才会由系统输出)
级别从小到大:
trace < debug < info < warn < error。
2.2.1.2、在配置文件中设置日志级别[!]
此时就将SpringBoot框架里的默认日志级别从 info 改成了 debug。还是之前的代码,此时程序运行结果多了打印 debug 日志!
当我们的项目中含有许多不同层级时,希望这些层级输出的日志级别都不一样,此时也可以通过配置文件按配置。
此时就可以在配置文件中给3个层级设置不同日志级别来让控制台输出不同的日志信息。
三、日志框架
SpringBoot引入了哪些日志框架??为什么能把日志打印出来??
四、日志的持久化[!]
我们现在所见到的日志信息都是打印在控制台的,但是控制台输出的信息并不会持久的保存,因此我们需要对日志进行持久化,确保日志能够永久、持久的保存、并且方便查看。
持久化的方式无非两种:1、存进数据库 2、保存进磁盘。
日志的持久化是保存在磁盘上,那么有两种方式保存在磁盘上:
4.1、配置文件中设置日志的保存路径
此时SpringBoot就会将你项目中所有输出到控制台的日志信息保存到你所设置的保存路径里。
我是先在D盘下建立名为mylogs的目录,然后在项目的配置文件中设置日志的配置项,此时项目启动之后,Spring就会在目录mylogs下生成spring.log文件,将项目输出的日志信息保存到该文件中。
日志信息持久化保存在文件里时,其内容是追加的,不会覆盖!
当设定的保存日志信息的文件保存了很多日志信息以至于文件量变大,导致每次打开日志文件就很困难时,SpringBoot是会设定一个文件保存最大值,当我们设定的文件里的日志信息达到该值后,SpringBoot就会新建一个文件保存日志信息。
4.2、配置文件中设置日志的文件名
五、System.out.println vs 日志框架存在的缺点
1、System.out.println 打印信息不全,缺少输出时间、打印来源…
2、不能实现像日志框架那样的隐藏和显示
3、System.out.println 打印的日志信息不能持久化
六、更简单的日志输出——lombok
使用 lombok 提供的 注解 @slf4j,
注解 @slf4j 等于代码:private static Logger 1ogger = LoggerFactory. getLogger(UserController .class);
, 方法里的类参数也不需要我们传入了,注解全部帮我们做好了。
此时就提供了一个log对象,通过此log对象使用日志框架里内置的方法输出日志信息。
使用lombok后,lombok为我们节省了一些代码的书写,只需要添加一个注解就好了,那么它的原理是什么?
lombok的常用注解: