目录
一、自定义打印日志
1.1 日志框架说明
1.2 实现自定义打印日志
1.3 日志的格式说明
2.1 日志的级别
2.2 设置日志级别的作用:
2.3 如何设置日志的级别
二、 日志的持久化
3.1 设置日志保存路径 (在 .yml 配置文件中设置日志保存路径)
3.2 设置指定日志文件名称
3.3 日志如何进行清理
三、更简单的日志输出 -- Lombok
4.1 使用注解:@Slf4j
前言
日志是一个程序必不可少的部分,如果程序在运行的过程中报错了,此时可以通过记录错误日志和警告日志 快速的定位问题并且找到问题原因。
日志除了定位问题之外,还有以下功能:
当启动一个 Spring Boot 项目时,默认就有日志的输出,如下图:
上图就是 Spring Boot 输出的控制台的信息,所以,Spring Boot 中内置了日志框架,否则不会输出日志,并且输出的日志不是程序猿打印的,如何自定义打印日志;最后:默认是显示在控制台上的,如果项目重启了,此时日志也就消失了,那如何将日志进行持久化方便开发人员去查找呢?
日志框架也是有很多种的,JUL,log4j... 每个日志的框架实现的方式都是不一样的,所以如果每个日志框架都要系统的学习,成本就很高,因此为了减少开发过程中的学习成本,此时就引入了日志门面:SLF4J。
和JDBC 编程是一样的,当有很多套规范的时候,各种数据库连接就麻烦了很多,需要学习不同数据库提供的不同的接口,学习成本很高,此时就引入了 JDBC 编程 去对接不同的数据库的接口,最后程序猿只需要学习 JDBC 编程之后就可以连接到不同的数据库;SLF4J也是同样的,日志的框架有很多,最后只需要学习 SLF4J 就可以对接到不同的日志框架了,相当于是一个总的接口。
1. 得到日志对象 | 注:(1)Logger 对象是 SLF4J提供的对象,导包时需要 注意. (2)Logger 对象的参数可以是一个类对象,也可以是一个类名(不推荐类名),如果参数是一个类名,打印日志时只会显示类名,如果同一包下有相同的类名,此时的日志信息中就无法区分多个同名的类 |
2. 使用日志提供的方法打印日志 | 下图代码所示: |
log.trace("i'm trace");//所有执行的痕迹都打印
log.debug("i'm debug");//调试的时候打印
log.info("i'm info");//普通日志,默认就是这个级别
log.warn("i'm warn");//警告日志
log.error("i'm error");//错误日志
运行结果:
注:上述的结果是已经设置了日志的级别了,默认的级别是info,所以这个级别以下的日志打印信息,在默认情况下是不会进行打印的,只会输出info以上的级别。
可以看到上述日志打印的格式: 时间,级别,线程信息,日志打印的所在类,(在上述创建一个日志对象时传参了一个类对象,此时在打印时就可以拿到这个类) 日志的打印信息
(1)trace:痕迹,微量,级别最低,设置后几乎所有的日志信息都会进行打印 |
(2)debug:开发环境中常用;需要调试时打印的关键信息 |
(3)info:普通日志的打印,日志的默认级别 |
(4)error:级别较高,错误的日志打印的信息 |
(5)fatal:致命的,因代码异常导致程序崩溃时会打印此日志 (注:只会在整个程序都异常时才会打印这个级别,否则默认也是不会打印这个日志的) |
日志级别的顺序:
(1)帮开发人员筛选重要的信息,例如:设置级别为 error,此时就可以只关注程序的报错打印的日志了,对于普通的日志和日常的业务中打印的日志可以忽略,更高效的帮助开发人员快速的定位程序的问题。 |
(2)可以控制在不同的环境下是否需要打印日志,例如:在开发环境中,需要详细的打印日志的调试信息,但是在生产环境中,需要保证性能和安全性就应当尽量减少日志的输出,而开发的调试打印日志就造成了数据污染,所以可以通过设置日志的级别,以控制不同环境中是否需要打印日志。 |
设置日志的级别是在配置文件中设置,此处演示在 yml 配置文件中如何设置日志的级别。
日志级别的设置是非常灵活的,可以精确到某一个子文件夹中的某一个类,如下代码:
# 日志级别的设置
logging:
level:
root: error #将根目录下的文件夹设置error级别
com:
example:
demo:
controller: trace #单独将
上述设置日志信息打印就是将根目录(root)目录下的文件设置为 error级别的,然后将 demo 包下的 controller 类设置成 trace 级别的(所有的日志信息都打印)
运行结果:
可以看到 Spring Boot 项目的启动日志并没有打印(包括端口号和项目启动时间),因为在上述配置文件中已经设置了 root 路径下的所有包下的 日志打印级别为 error,项目的启动日志也是包含在这个包中的,所以 error 以下级别的日志不会进行打印。
但是在访问 sayHi 方法之后,可以看到 Controller 这个类的所有日志的信息全部都打印了,是因为上述配置文件中的 Controller 类中的日志打印级别为 trace。
持久化很常见,在数据库中介绍过 作用就是将数据持久化,io操作中也提到将数据写入文件 也是对数据持久化,日志的持久化也是一样的,就是将日志的信息保存下来,之后方便开发人员查看并定位问题。
# 日志保存路径(1. 尽量不要保存在 系统盘(C盘)) (2. 路径中不要出现中文)
logging:
file:
path: D:\home #此时只需要将路径写上即可 不用设置目录名,会自动生成名录名的
在 项目启动之后,可以在对应目录中查看是否有日志文件
访问 sayHi 方法后,可以查看是否会有日志信息覆盖原来的 日志信息:
首先并没有创建新的日志文件,可以看到原来的日志并没有消失,后来新的日志是在原来的基础上进行了追加操作。
# 日志保存路径(1. 尽量不要保存在 系统盘(C盘)) (2. 路径中不要出现中文)
logging:
file:
name: D:\\home\\springBoot.log
#此时可以设置写入特定文件,可以包含指定目录,也可以不指定目录,
#如果不指定特定目录,创建日志文件是和项目在同一级目录下
运行结果:
查看 Spring Boot 更多系统配置项,访问官网:https://docs.spring.io/springboot/docs/current/reference/html/application-properties.html#application-properties
可以点击上述网址查看更多配置,可以看到日志文件可以设置最大日志文件大小:
还有如果超出指定文件大小之后需要重新创建日志文件,那文件名是如何命名的;
会有指定的文件名的格式来区分 日志文件的日期的,如:在文件名之后 + 数字的形式或者日期的形式来区分 很多的日志文件。
所以如果日志文件过了很长时间之后,如果没用了就可以删除了。
在打印日志时每次都需要创建一个日志对象,而且是每个类都要添加一个日志对象,很繁琐,因此有一种更简单的方式实现日志的打印:使用注解 -- @Slf4j 。
如果在创建 Spring Boot 项目时,起步依赖没有添加 Lombok,此时可以先安装一个插件:
之后在pom.xml 中添加依赖:
使用注解方式创建日志对象: