本篇博客主要介绍自定义的日志打印、日志的级别高低、如何保存日志等等.....
日志就是我们控制台上输出的内容,控制台上的输出的信息就是日志信息,如下所示:
日志有什么用?
日志最大的作用就是可以定位和发现问题;除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:
记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。
记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。
以上就是⽇志的一些主要功能。
前面我们说过,日志就是输出在控制台的信息,那么我们自定义日志打印是不是就是直接使用System.out.print来输出信息到控制台呢?我们先来看一下日志包含的各个信息,再来说是否可以直接使用System.out.print来输出。
日志的格式说明:
通过这个我们可以看出,打印的日志信息中,时间、打印日志所在的类、日志的具体信息,这些我们都可以在System.out.print中直接输出,但是日志的级别,我们是无法获取的,日志级别也是很重要的,可以在我们排查问题的时候,可以根据日志级别来更快的找到我们所要的信息的。
还有一点很重要的是,System.out.print打印的信息无法持久化的保存。因此,我们使用System.out.print来打印日志是不合适的。
首先我们要在程序中获取⽇志对象需要使⽤⽇志⼯⼚LoggerFactory。接着再通过日志对象打印日志。
需要注意的是:Logger 对象是属于 org.slf4j 包下的,不要导⼊错包。
接下来我们用代码来演示一下:
这里一定得选择slf4j这个包下的Logger类;
到了这里之后,这里会出现两个getLogger方法,这两个方法的区别在于:
一个是传入一个类对象,一个是直接传一个字符串;
传递这个的意义就在于在打印日志时,输出的类所在的位置,当我们传入的是一个字符串时,打印出来的效果就是我们自己设置的位置;当我们传入当前类对象的时候,打印出来的效果就是这个类所在的具体位置,从包名到类名,十分详细。因此,这里建议传入一个类对象。
打印日志代码:
package com.example.bloglog.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.RestController;
@RestController
public class TestController {
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/sayhi")
public String sayHi(){
log.trace("trace日志");
log.debug("debug日志");
log.info("info日志");
log.warn("warn日志");
log.error("error日志");
return "hello";
}
}
运行结果:
以上代码就是最基本的自定义日志打印的代码了,但是这里我们预计是输出五个日志都打印,但是这里只打印了后面的三个日志;这里就涉及到日志级别及日志级别的问题了。
日志总的来说:可以分为六个级别,分别是:
trace:微量,少许的意思,级别最低;
debug:需要调试时候的关键信息打印;
info:普通的打印信息(默认⽇志级别);
warn:警告,不影响使⽤,但需要注意的问题;
error:错误信息,级别较⾼的错误⽇志信息;
fatal:致命的,因为代码异常导致程序退出执⾏的事件。
日志级从高到底排序图:
日志默认级别的设置:如下所示:只需要设置logging.level,root=xxx(设置日志级别)即可
以下代码我们是设置了日志级别为trace,代表的就是trace及以上的日志就会输出,如果不设置的话,默认的日志级别就是info,只有大于等于info级别的日志才会输出。
我们在生产环境上的日志是需要保存下来的,因为一旦在生产环境下出现了什么问题,我们才可以通过日志来进行分析问题,进而才能更快更好的解决问题。
日志的持久化保存我们需要设置的东西有两个,一个是日志文件的名称,一个是日志文件的保存位置。
对于设置日志的保存位置及日志的名称,我们需要在配置文件中进行设置,设置的代码如下:
使用logging.file.path设置来保存的路径,但是这个方法设置不了日志的文件名,只能设置日志保存的位置;运行之后产生的日志文件如下所示:默认的日志文件名就是spring.log
我们还可以使用logging.file.name来设置,使用这个方法设置我们不仅可以设置日志的保存位置,还可以设置日志名称。设置代码如下所示:
运行后产生的文件如下:这时候我们就可以设置日志名称和位置了
当我们使用logging.file.name设置了日志文件名称之后,不设置保存路径,默认会保存到当前项目的路径下。如下所示:
答案是:不可以,因为当这两个属性一起出现时,会以logging.file.name为主,就不会再去看logging.file.path的设置了,如果这时候logging.file.name中没设置路径的话,就会直接保存到当前项目的路径下。如下所示:
对于logging.file.name和logging.file.path的使用我们只需要记住以下三点规则:
1.logging.file.path只能设置日志保存的位置,不能设置日志保存名称;
2.logging.file.name既可以设置日志保存位置+名称,但是不能单独设置日志保存的位置;
3.当logging.file.name和logging.file.path一起使用时,会以logging.file.name的设置为主,logging.file.path中的设置不生效。
还有一个需要特别注意的就是:当我们只使用了logging.file.name并且只设置了日志的保存位置时,没有设置日志的名称时,即使这时候也使用logging.file.path设置路径了,日志都是不会保存的!!!如下所示:
我们前面的自定义日志输出,需要在每一个类中都去从日志工厂获取一个日志对象,而且在选择LoggerFactory的时候还需要特别注意,一不小心就会选错,选成其他包下面的,因此这还是比较麻烦的。这里我们就可以直接使用Lombok来获取日志对象,这样子不仅不容易出错,而且还更简单。代码如下所示:
至于如何在IDEA中安装使用Lombok,可以看这篇博客☞ Spring执行流程及Bean的作用域与生命周期_小白学编程~的博客-CSDN博客