什么是日志呢?其实就是一条条的打印语句,我们就可以根据打印出来的日志,去分析程序存在的问题等。虽然作为后端开发人员,日志并不是那么重要,但是在学习的过程中,也是比较重要的,可以使用在我们的项目中,所以我们也要去学习和了解。
目录
1.日志的作用
2.日志的使用
3.日志的格式和等级
4.配置日志和持久化
5.更加简单的日志打印
1.日志的作用
先笼统的介绍几个作用
(1)系统监控
比如,可以监控系统,查看是否被攻击,都会记录下每一个客户端的行为(访问了哪些方法等)
(2)数据采集
比如,收集客户端的喜好等
(3)日志审计
这种一般是国家需要等
上面的几个作用看起来非常的高大尚,似乎对于现在的我们来说好像没多大作用,但是不仅有上面的作用,还有下面更贴切我们的实际意义。
第一:可以应用于我们的程序中,更好的排查和发现程序bug和问题
第二:可以使用在项目中,使项目更加的丰富
第三:可以装逼。毕竟这个词在外行人听起来,就是比较高大尚。
下面,我们就来学习如何去使用吧!
2.日志的使用
我们不使用System.out.println()去打印日志只有一句话,看起来非常的丑陋;我们看一下Spring打印的日志
看起来也是非常的beautifu,那它是如何实现的呢?请看vcr
(1)日志打印说明
我们打印日志都将会使用一个框架:slf4j (撒拉佛接),Spring也内置了该框架,所以我们只需要学习如何使用即可。
打印日志的步骤:一:获取日志对象 ;二:使用日志对象进行打印日志
(2)第一:获取日志对象
获取日志对象会使用一个工厂对象,直接调用并且接收即可。
完整代码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class LogController {private static Logger log = LoggerFactory.getLogger(LogController.class);
}
代码解释:
工厂类需要一个参数,就是类名。
作用:日志需要知道是哪一个类下的方法,也就是用来定位。
拥有了日志对象,我们就可以打印日志了
(3)第二:使用日志对象打印日志
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;@Controller
public class LogController {private static Logger log = LoggerFactory.getLogger(LogController.class);@PostConstructpublic void print() {System.out.println("===========================================");System.out.println("打印日志ing");log.info("打印日志ing");System.out.println("===========================================");}
}
打印结果:
我去,使用slf4j打印出的日志咋这么好看,跟系统日志一样,爱了爱了。
3.日志的格式和等级
(1)日志的格式
上面我们介绍了日志的使用,下面先学习一下上述日志打印的格式
上述就是日志的格式了,其中有几处注意事项:
- 配置的项目名称:
- 打印日志的对象:
- 日志的级别:这里我们下面直接介绍
(2)日志的级别
日志从高到低的级别依次为:FATAL、ERROR、WARN、INFO、DEBUG、TRACE
- FATAL:致命信息,表示需要立即被处理的系统级错误(一般不会出现,出现也不会通过日志的形式)
- ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行
- WARN:警告信息,不影响使用,但是需要去注意的问题
- INFO:普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等
- DEBUG:调试信息,需要调试时候的关键信息打印
- TRACE:追踪信息,比DEBUG更细粒度的信息事件(一般也不会被保留)
上述就是日志的各种级别,下面我们来观察日志框架默认可以打印出的日志级别
打印结果:
由此可见,slf4j框架默认打印的日志级别就是:info、warn、error,最高等级的直接没有,两个最低等级的默认不保留。
那还有什么办法可以保留指定等级的日志呢?答案当然是有的,那就是通过配置文件去配置即可
4.配置日志和持久化
首先,我们先来介绍日志的配置,上述我们知道,默认打印的日志级别是info及以上的,也就是debug和trace是不会打印。
(1)日志的配置
我们设置日志的级别是设置在某个目录下的最低级别日志是多少
- 设置所有的路径下日志级别是:debug
然后运行发现:非常多的日志都打印出来了
- 我们再配置回info级别:
我们发现:跟没有配置级别的是一样的。得出配置日志的作用:当年配置了某个路径下的日志级别后,那么该路径下系统打印出的日志级别就是我们配置的,但是其他路径依然是info
- 我们现在来只设置我们包下的日志级别:
运行结果:debug的日志也可以打印出来了
OK,日志级别的配置到这里就完了,但是还是不推荐我们去随意配置日志级别。
(2)日志的持久化
上面我们使用的日志,都是打印在控制台上的,程序一结束就不见了,只有保存在外存上(硬盘)才能做到持久化,下面我们介绍日志如何保存在文件上。
- 把日志保存在指定的文件目录下:
yml格式:
logging:file:path: D:/JavaCode/logger
程序运行后:
上面这种是配置文件路径,也就是会保存在指定问文件目录下。
- 给日志配置指定文件名(项目中)
yml格式:
logging:file:name: xxxx
运行结果:
上面这种配置文件名字,得出的文件路径会跟随着项目的路径
注意点:如果上述的path和name同时设置,会以name为准,也就是以name为优先级
- 配置日志文件的分割
yml格式:
logging:logback:rollingpolicy:max-file-size: 1KB
我们配置文件大小到底1kb就进行切割,也就是换一个文件进行存储。
运行后:当大小到达1kb后,就进行了分割
对于日志,还有很多格式,比如说日志的格式,颜色等,这里就不介绍了
5.更加简单的日志打印
虽然说,我们目前的日志打印已经非常快了,但是还是很繁琐,下面介绍使用注解来打印日志
分成两步:第一步:添加lombok框架支持(导入依赖)第二步:使用@slf4j注解输出日志
(1)第一步:导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
我们在创建项目的时候已经存在了,就不需要再导入
(2)第二步:代码编写(使用注解):@Slf4j
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
@Slf4j
@Controller
public class LogController {//private static Logger log = LoggerFactory.getLogger(LogController.class);@PostConstructpublic void print() {System.out.println("===========================================");//System.out.println("打印日志ing");log.trace("我是trace日志");log.debug("我是debug日志");log.info("我是info日志");log.warn("我是warn日志");log.error("我是error日志");System.out.println("===========================================");}
}
该注解默认的对象名字是:log,所以我们直接使用即可,下面看一下运行结果。
结果也是一样的,所以我们后续就直接使用注解去打印日志即可。