一. 关于 Spring Boot 日志的使用
Spring Boot 日志机制和工具用于记录应用程序的日志信息和追踪应用程序的执行过程。它集成了常用的日志框架,如 Log4j、logback、Java Util Logging等,并提供简单易用的配置方式,让开发人员可以方便地监控应用程序的运行状态和性能。在项目启动时,日志已经开始输出,但尚未持久化。下面是一个最简单、最常见的日志示例。
二. 日志的作用
日志是记录应用程序运行状态和运行过程中所发生的事件的一种技术手段。它能够帮助开发人员更容易地追踪和排查问题,同时还可以提高应用程序的安全性、稳定性和可靠性。
在软件开发过程中,日志可以:
1.调试程序:当程序出现问题时,可以查看日志文件以分析问题的原因,从而进行适当的修复。
2.跟踪操作:在应用程序中记录用户操作,以便进行回顾和审计,保证系统安全。
3.监控性能:对于服务器端应用程序,可以记录响应时间、CPU、内存和硬盘使用情况等指标,以便及时发现并解决性能问题。
4.系统运行情况:记录应用程序在不同环境下的运行状态、故障等,以便于开发人员和管理员及时了解系统运行情况,保证系统的稳定性和可靠性。
5.统计数据:将日志文件作为数据来源,进行统计分析,以便了解用户行为、访问量等信息,从而进行决策和规划。
总而言之,日志是一种非常重要的技术手段,它能够帮助开发人员更好地维护应用程序、改进用户体验和提高应用程序的稳定性和可靠性。从上面的 Spring Boot 项目启动日志可以看出,启动过程中打印了一些信息,其中包括 BUG 等级和端口号等。然而,这些仅仅是启动日志的一小部分,实际上日志还能记录更多的信息。
记录登陆日志, 利于分析用户是否正常登陆, 防止其恶意攻击破解用户倘若我们记录用户的登陆日志,就能利用用户登陆的频率、输入次数、地理位置等信息,对其进行分析以判断是否存在异地风险登陆、多次暴力破解等异常情况。
记录系统的操作日志, 方便数据恢复和定位操作比如一个医院的病历系统,记录每位患者的就诊情况、诊断结果、治疗方案等信息。当医生误诊或操作失误时,比如开错药、做错手术等,可以根据系统的操作日志进行回滚操作,及时发现问题并进行纠正。同时,系统还可以记录每位医生的操作记录,便于管理人员进行追责和改进工作。
记录系统执行时间, 方便优化程序做数据支撑记录一个程序开始时间, 在结束时也记录一下时间, 从而可以获取到该程序的执行时间. 执行时间过长, 那么需要考虑去如何优化它.
当然, 除了上面列举的一些作用, 日志还有其他重要用途, 大家可以自行探索
三.如何使用日志
对于 Spring Boot 中, 它内置了 SLF4J 框架, 可以直接在程序中进行调用 SLF4J 来打印日志, 并且日志一个门面模式, 何为门面模式呢?
在这举例来说就像找房子一样, SLF4J 在这就充当了这个房屋中介的作用, 而它手下不同房子就是它的实现. 例如大平层( Log4j ) 、小洋房(logback ) 、海景别墅( Java Util Logging ). 某一天你需要租一个房子来装你得东西, 你就去找房屋中介, 房屋中介就会给你介绍上面的几种房屋类型, 你可以自己进行选择. 比如你选择了大平层, 你住腻了可以换一个通过中介在海景别墅, 这样你就可以省去找房子的时间, 想更换只需要通过中介进行更换就可以了
带入到我们的日志中, 中介就是日志的门面, 中介控制的房子就是日志的实现 , 这样有什么好处呢 ? 我们不再需要去关注门面, 托管给别人帮我们做了,只需要去看喜欢那个房子( 用什么日志方式去输出就行 ) 有一天住腻了 ( 这个日志方式出了问题 ) 就可以快速的通过中介在换一个房子( 换一个日志方式 )
, 避免在没有地方可以去( 你所有的日志都用的这个方法去控制, 没有中介那你想要换个房子就需要很长时间去修改 )
了解了日志得门面模式以后, 接下来看看如何自定义实现也给日志
1. 得到日志对象
注意级别根据上述系统日志的启动记录可以发现,所有日志信息都属于同一类别,因此所获取的日志对象必定为类级别的日志对象,而非仅在某个具体方法中实现的方法级别对象。
注意作用域启动系统日志后,每个日志都会带有其位置信息,即可以清晰看到其所在的包和类名。因此,为避免日志位置混乱,日志对象必须私有化,只能在该类内使用,而不能在其他类中使用。
注意框架的选择由于我们在使用 SLF4J 作为门面模式时, 去创建日志对象需要通过门面去调用具体的实现方式, 因此创建日志对象时应当选择 SLF4J 下的 Logger
综上, 最终通过 SLF4J 的 Logger 创建一个 log 对象, 并通过提供的日志工程去调用 getLogger ( 因为是类级别的, 因此此处选择类 的 getLogger 方法 )成功创建一个日志对象
2. 使用 log 对象**
访问路由后在控制台可以看到如下信息 :
PS : 日志信息打印此处和你们默认的不一样, 我在配置文件中设置了默认等级为 debug, 日志系统默认等级为 info, 下面会说这个问题,
此处只关注日志对象输出日志有哪些内容即可
时间信息、日志等级信息、日志位置信息、日志内容信息. 可以说是非常的齐全日志
四. 日志等级
日志等级用于指示日志消息的重要性或严重程度,开发人员可以设置日志级别以过滤掉不必要的日志消息,同时也可以根据日志级别快速定位和解决日志问题。
常见的日志等级包括:
1.DEBUG:用于调试或开发阶段,产生大量日志;
2.INFO:提示性消息,用于标记应用程序的主要分支和进度;
3.WARN:警告性消息,用于提示可能会导致程序问题或潜在错误的情况;
4.ERROR:标记错误事件,用于记录程序中的错误;
5.FATAL:严重错误,可能导致程序崩溃或无法工作,是最高级别的日志等级。
当设置日志级别时,高级别的日志消息也会同时输出更低级别的所有日志消息,例如设置日志级别为WARN将输出所有的WARN、ERROR和FATAL日志消息。
总之,日志等级是日志记录中非常重要的一个概念,它可以帮助开发人员精确排查和调试日志问题,提高应用程序的可维护性和可读性。
1.trace : 微量级别, 级别最低
2.debug : 需要调试的时候使用, 调试级别
3.info : 普通的打印信息 ( 日志默认的级别 )
4.warn : 警告, 不影响使用, 但是需要注意的问题
4.error : 错误信息, 级别比较高的错误日志信息
6.fatal : 致命的, 因代码异常导致程序执行退出的事件上面就是日志的级别, 但是我们能够操作的日志级别只有前五个, 最后一个致命的日志级别是无法操控的, 当程序错误退出的时候, 系统会自动帮我们打印fatal 级别的日志信息.
从上之下, 级别是越来越高的, 越往下接收的消息越少, 遵守一个原则低级别的无法查看高级别的
可以看到, 只能查看到 info、warn 和 error 级别的错误信息, 而 trace 和 debug 是无法查看的, 这是为什么呢 ?当我们把 info 注销掉在看看
可以看到, 只有 info 不见了, 在把 warn 和 error 注释掉看看
此时没有任何日志信息, 可以得到结论 日志的默认等级是 info, 哪当我们想查看 trace 和 debug 的日志信息怎么办呢 ?
毕竟调试日志对于写程序来说是很重要的, 可以定位问题所在 , 下面就介绍一下 Spring Boot 中项目中日志的等级设置
五. 日志级别设定
开发人员可以根据实际需要设置日志级别,从而控制日志输出的内容。通常来说,开发人员应该将日志级别设置为INFO或者以上级别,避免输出过多无用信息。同时,可以根据实际情况将日志级别调整为更高或更低级别,以满足具体的需求。
日志级别的设定是优化日志输出的关键。在开发过程中,合理设定日志级别可以帮助开发人员快速定位、解决程序中的问题。因此,开发人员需要根据实际需求,合理设置日志级别。在 properties 配置文件中,可以使用以下代码来设置日志等级:
# 设置日志记录级别
log4j.rootLogger=INFO
其中,log4j.rootLogger 表示根日志记录器,INFO 表示记录 INFO 级别及以上的日志信息。如果需要记录更详细的日志,可以将 INFO 换成 DEBUG 或 TRACE。
另外,也可以针对特定的包或类进行日志等级的设置,如下所示:
log4j.logger.com.example=DEBUG
其中,com.example 表示需要设置日志等级的包或类名,DEBUG 表示记录 DEBUG 级别及以上的日志信息。或者在配置文件中设定日志级别:完成配置后,我们需要使用 log 方法对程序执行过程中的信息进行记录。在进行观察之前,建议首先打印一下 log 信息,以便了解程序在执行时的日志情况。根据配置文件中的设置,我们可以看到由于默认等级是 debug,因此程序执行过程中 debug 等级的错误日志信息可以被记录下来。然而,如果想查看比 debug 更低等级的trace级别的日志信息的话,就需要将日志等级设置为 trace 了。
另外, 配置文件中除了 root(根记录器 ) 设置为日志等级外, 还有更加详细的日志等级设置, 为特定的包设置日志等级 ,
例如下面这个配置文件中, 设置 com.example 包下的类日志等级为 info, 而 com.example.demo 包下的日志等级为 debug
六. 日志的存储
日志作为记录系统运行状态和问题的重要组成部分,其存储方式至关重要。为了保证系统日志的完整性和可靠性,需要采用合适的存储方式,通常包括以下几种:
1.文件存储:将日志记录到文件中,便于查阅和分析。可以按照时间、事件等方式进行分类保存,也可以对日志进行压缩和归档处理。
2.数据库存储:将日志记录到数据库中,可以方便的进行查询、分析和统计处理。同时还可以利用数据库的事务机制保证数据的一致性和完整性。
3.日志聚合:将多个日志源的信息聚合到一起,形成一个整体的日志记录。通过对这些日志进行统计和分析,可快速定位问题和进行优化。
不同的存储方式各有优劣,需要根据具体的需求和场景选择合适的方案。无论采用何种方式,都要注意日志的保密性和安全性,在存储和传输过程中采取相应的加密和认证措施,避免信息泄露和攻击。当然, 日志如此重要不仅仅是因为它可以定位问题, 更重要的时候它可以作为数据分析, 想要数据分析肯定不能通过控制台 sout 的方式打印日志,
下次启动就没有了, 因此就必须将日志进行持久化, 下面就来实现日志的持久化操作
在 yml 配置文件中设置. 设置文件路径, 文件的名称可以不写( 写了生成的就是你设置的名称 ), 会自动生成一个名为 spring.log 的文件
再去运行刚刚的 log 方法, 此时在我刚刚的保存路径底下就生成了这样一个 spring.log 文件
当我重复去访问这个方法时, 它会重复打印日志, 我们来看看会不会覆盖
事实上, 它是不会覆盖的, 如果真的覆盖了那才是出大问题了 !
PS 1 : 在文件的保存路径设置中, 如果没有设置路径, 它会在项目底下生成一个你设置的名称的文件
PS 2 : 在官网中可以看到说明, 当日志文件超过 10MB 大小时, 它会将你后续得日志文件保存在一个新的文件中(
并且它会按照自己的命名规则替你命名和分割日志 ), 但是这个日志文件的大小也是可以去设置的 # 七. 使用Lombok简化日志记录
Lombok是一个Java库,通过注解实现了简化Java代码的编写,包括简化日志记录的编写。在Java应用程序中,日志记录是非常重要的,但是传统的Java日志记录方式通常需要编写大量的冗余代码。Lombok的日志相关注解可以让我们轻松地实现日志记录功能,大大减少了代码量。下面将介绍如何使用Lombok简化日志记录。
1. 添加依赖
首先需要在项目中添加Lombok依赖,具体方式可以在项目的pom.xml文件中添加以下代码:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2. 使用注解
使用Lombok实现日志记录功能非常简单,只需要使用@Slf4j注解即可,如下所示:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class TestLog {
public static void main(String[] args) {
log.debug("debug message");
log.info("info message");
log.warn("warn message");
log.error("error message");
}
}
@Slf4j注解实际上会自动为我们生成一个名为log的静态变量,在代码中可以直接使用log对象输出日志信息。当然,我们也可以手动定义日志对象,如下所示:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestLog {
private static final Logger LOGGER = LoggerFactory.getLogger(TestLog.class);
public static void main(String[] args) {
LOGGER.debug("debug message");
LOGGER.info("info message");
LOGGER.warn("warn message");
LOGGER.error("error message");
}
}
这里采用了传统的Java日志记录方式,不过使用了Lombok简化变量定义的代码量。
3. 注意事项
在使用Lombok进行日志记录时,需要注意以下几点:
1.需要在项目中正确添加Lombok依赖。
2.在使用Lombok的@Slf4j注解时,需要保证项目中至少引入了一种日志框架。
3.在使用Lombok的@Data注解时,需要特别注意成员变量的访问权限,避免数据泄露问题。
4. 总结
Lombok的日志相关注解能够很好地简化Java代码的编写,特别是对于Java应用程序中频繁使用的日志记录功能,使用Lombok可以大大减少代码量和开发时间,提高开发效率。在使用Lombok进行日志记录时,需要注意Lombok的使用约定和注意事项,避免引入不必要的麻烦。可以发现,在不同类中实现日志输出时,都需要手动创建日志对象并修改getLogger方法中的类对象,这样操作有些繁琐。因此,lombok提供了一种更加简便的方式来实现日志输出。这个步骤比较简单,只需要手动添加 lombok 依赖即可。2. 增加 @slf4j 注解
除了 @slf4j 注解, lombok 还提供许多其他的注解, 您可以前往官网进行查看.