开发者

Spring Boot 日志配置与常见问题及解决方案

目录
  • Spring Boot 日志配置与常见问题解析
    • 引言
    • 什么是日志?
    • 日志的重要性
    • 日志使用
      • 打印日志
    • 日志框架介绍
      • 日志格式的说明
        • ⽇志级别
          • 日志级别的分类
          • 日志级别的使用
        • Spring Boot 日志配置
          • 1. 设置日志级别和格python
          • 2. 配置日志收集器
          • 3. 查看和分析日志
          • 4.日志的持久化
          • 5.设置日志的颜色
        • 常见日志问题及解决方法
          • 1. 日志配置文件找不到
          • 2. 日志文件输出到错误的地方
          • 3. 日志级别设置错误
          • 4. 日志文件找不到
        • 总结

        Spring Boot 日志配置与常见问题解析

        引言

        在软件开发中,日志记录是理解应用程序行为、定位问题和确保合规性的重要工具。Spring Boot 提供了灵活的日志配置机制,帮助开发者高效地监控和分析应用。本文将介绍如何配置 Spring Boot 的日志,解决常见问题,并提供实用建议。

        什么是日志?

        日志记录程序在运行过程中产生的各种信息,包括错误、警告、信息和调试级别。日志文件可以帮助开发者快速定位问题、跟踪应用程序行为,并满足合规性要求。

        随着项目的复杂度提升, 我们对日志的打印也有了更高的需求, 而不仅仅是定位排查问题.

        比如需要记录⼀些用户的操作记录(⼀些审计公司会要求), 也可能需要使用日志来记录用户的⼀些喜好,

        把日志持久化, 后续进行数据分析等. 但是 System.out.print 不能很好的满足我们的需求, 我们就需要使用⼀些专门的日志框架。

        日志的重要性

        • 快速定位问题:通过分析日志,开发者可以迅速定位应用程序中的错误或性能问题。
        • 确保合规性:许多行业要求应用程序符合特定标准,日志记录了应用程序的运行状态,便于审计和合规性检查。
        • 提高开发效率:日志记录了应用程序的历史行为,有助于快速复现问题并优化代码。

        我们知道日志主要是为了发现问题, 分析问题, 定位问题的, 但除此之外, 日志还有很多用途:

        1. 系统监控

        监控现在几乎是⼀个成熟系统的标配, 我们可以通过日志记录这个系统的运行状态, 每一个方法的响应时间, 响应状态等, 对数据进行分析, 设置不同的规则, 超过阈值时进行报警. 比如统计日志中关键字的数量,并在关键字数量达到⼀定条件时报警,这也是日志的常见需求之一

        2. 数据采集

        数据采集是⼀个比较大的范围, 采集的数据可以作用在很多方面, 比如数据统计, 推荐排序等.

        • 数据统计: 统计页面的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进行数据分析, 优化公司运营策略

        • 推荐排序: 目前推荐排序应用在各个领域, 我们经常接触的各行各业很多也都涉及推荐排序, 比如购物, 广告, 新闻等领域. 数据采集是推荐排序工作中必须做的一环, 系统通过日志记录用户的浏览历史, 停留时长等, 算法⼈员通过分析这些数据, 训练模型, 给用户做推荐。

        下图中的数据源, 其中⼀部分就来自于日志记录的数据

        Spring Boot 日志配置与常见问题及解决方案

        Spring Boot 日志配置与常见问题及解决方案

        3. 日志审计

        随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上. 网络安全越来越受到大家的关注, 系统安全也成为了项目中的⼀个重要环节, 安全审计也是系统中非常重要的部分. 国家的政策法规、行业标准等都明确对日志审计提出了要求. 通过系统日志分析,可以判断⼀些非法攻击, 非法调用,以及系统处理过程中的安全隐患。

        比如, 运营系统, 其中运营⼈员在通过界⾯处理⼀些数据的时候, 如果没有清楚的日志操作记录, ⼀条数据被删除或者修改, 你是无法找到是谁操作的,但是如果你做了相应的记录,该js数据被谁删除或者修改就会一目了然.

        还有⼀些内部的违规和信息泄漏(比如客户信息被卖掉)现象出现后, 如果未记录留存日志 为事后调查提供依据, 则事后很难追查(⼀些公司查看客户的信息都会被记录日志, 如果频繁查询也会报警。

        日志使用

        spring 在项目启动的时候就有日志输出,如下图所示:

        Spring Boot 日志配置与常见问题及解决方案

        那么这个日志跟System.out.print有什么区别呢?

        @RestController
        @RequestMapping("/logger")
        public class loggerController {
         @RequestMapping("/log")
            public String log(){
             System.out.println("打印日志");
             return "打印日志";
         }
        }

        可以看到:

        Spring Boot 日志配置与常见问题及解决方案

        可以看到, 我们通过 System.out.print 打印的⽇志, ⽐ SpringBoot 打印的⽇志缺少了很多信息.

        打印日志

        1.在程序中得到打印日志对象

        private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

        注意:Logger 对象是属于 org.slf4j 包下的, 不要导⼊错包.

        Spring Boot 日志配置与常见问题及解决方案

        日志对象的打印方法有很多种,我们可以先使用 info() 方法来输出日志

        @RestController
        @RequestMapping("/logger")
        public class loggerController {
          private Logger logger= LoggerFactory.getLogger(loggerController.class);
            @RequestMapping("/log")
            public String log(){
                logger.info("====日志内容=====");
                return "打印日志";
            }
        }

        效果:

        Spring Boot 日志配置与常见问题及解决方案

        使用注解打印日志 – @Slf4j

        添加 lombok 依赖:

                <dependency>
        			<groupId>org.projectlombok</groupId>
        			<artifactId>lombok</artifactId>
        			<optional>true</optional>
        		</dependency>
        @Slf4j
        @RestController
        public class LogController {
         public void log(){
         log.info("--------------要输出⽇志的内容----------------");
         }
        }

        lombok提供的 @Slf4j 会帮我们提供⼀个日志对象 log, 我们直接使用就可以。

        Spring Boot 日志配置与常见问题及解决方案

        日志框架介绍

        Spring Boot 日志配置与常见问题及解决方案

        1.门面模式(外观模式)

        定义:

        门面模式(Facade Pattern)⼜称为外观模式, 提供了一个统⼀的接口, ⽤来访问⼦系统中的⼀群接口.

        其主要特征是定义了⼀个高层接口, 让子系统更容易使用。

        门面模式主要包含2种角色:

        外观角色(Facade): 也称门面角色,系统对外的统⼀接口.

        子系统角色(SubSystem): 可以同时有⼀个或多个 SubSystem. 每个 SubSytem 都不是⼀个单独的类,而是⼀个类的集合. SubSystem 并不知道 Facade 的存在, 对于 SubSystem 而言, Facade 只是另⼀个客户端而已(即 Facade 对 SubSystem 透明)

        比如去医院看病,可能要去挂号, 门诊, 化验, 取药, 让患者或患者家属觉得很复杂, 如果有提供接待人员, 只让接待⼈员来处理, 就很方便。

        Spring Boot 日志配置与常见问题及解决方案

        门面模式的优点

        • 减少了系统的相互依赖. 实现了客户端与子系统的耦合关系, 这使得子系统的变化不会影响到调用它的客户端;

        • 提高了灵活性, 简化了客户端对子系统的使用难度, 客户端无需关心子系统的具体实现方式, 而只需要和门面对象交互即可.

        • 提高了安全性. 可以灵活设定访问权限, 不在门面对象中开通方法, 就无法访问

        日志格式的说明

        那打印的日志是什么呢?

        Spring Boot 日志配置与常见问题及解决方案

        从上图可以看到,日志输出内容元素具体如下(从左往右):

        时间日期:精确到毫秒日志级别:ERROR, WARN, INFO, DEBUG 或TRACE进程ID线程名Logger名(通常使用源代码的类名)日志内容

        ⽇志级别

        日志级别代表着⽇志信息对应问题的严重性, 为了更快的筛选符合目标的日志信息.

        试想一下这样的场景,假设你http://www.devze.com是⼀家 2 万人公司的老板, 如果每个员工的日常工作和琐碎的信息都要反馈给你, 那你⼀定无暇顾及. 于是就有了组织架构,而组织架构就会分级,有很多的级别设置,如下图所示:

        Spring Boot 日志配置与常见问题及解决方案

        有了组织架构之后,就可以逐级别汇报消息了, 例如:组员汇报给组长, 组长汇报给研发⼀组, 研发⼀组汇报给 Java 研发, 等等依次进行汇报.

        日志级别大概是同样的道理,有了日志级别之后就可以过滤自己想看到的信息了, 比如只关注error级别的, 就可以根据级别过滤出来error级别的日志信息, 节约开发者的信息筛选时间。

        日志级别的分类

        1.Error

        严重性问题或错误,常用于捕捉不可恢复的错误或异常

        2.Warning

        警告性信息,常用于提醒可能的问题或性能优化建议

        3.Info

        一般信息或状态更新,常用于提供程序运行的基本信息

        4.Debug

        详细调试信息,常用于调试过程中使用的调试信息

        TRACE: 追踪信息, 比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)

        5.FATAL

        致命信息,表示需要立即被处理的系统级错误。

        6.error

        错误信息, 级别较高的错误日志信息, 但仍然不影响系统的继续运行。

        Spring Boot 日志配置与常见问题及解决方案

        日志级别的使用

        日志级别是开发⼈员自己设置的. 开发人员根据自己的理解来判断该信息的重要程度。

        类似公司管理, 通常由领导来判断什么样的事情需要汇报, 什么样的事情不需要汇报。

        针对这些级别, Logger 对象分别提供了对应的方法, 来输出日志。

        @RestController
        @RequestMapping("/logger")
        public class loggerController {
          private Logger logger= LoggerFactory.getLogger(loggerController.class);
          //打印不同级别的日志
            @RequestMapping("/log")
            public String log(){
                logger.info("====日志内容=====");
                logger.trace("====日志内容=====");
                logger.debug("====日志内容=====");
                logger.error("====日志内容=====");
                logger.warn("====日志内容=====");
                return "打印日志";
            }
        }

        SpringBoot 默认的日志框架是Logback, Logback没有 FATAL 级别, 它被映射到 ERROR .

        出现fatal日志,表示服务已经出现了某种程度的不可用, 需要需要系统管理员紧急介⼊处理. 通常情况下, ⼀个进程生命周期中应该最多只有一次FATAL记录.

        结果发现, 只打印了info, warn和error级别的⽇志

        这与日志级别的配置有关, ⽇志的输出级别默认是 info级别, 所以只会打印大于等于此级别的日志, 也就是info, warn和error。

        Spring Boot 日志配置与常见问题及解决方案

        Spring Boot 日志配置

        日志级别配置只需要在配置⽂件中设置"logging.level"配置项即可。

        1. 设置日志级别和格式

        application.properties 文件中,可以设置日志级别、格式和输出渠道。常用配置如下:

        • 日志级别spring.applog enabled=true(启用日志记录)
        • 日志级别spring.applog level=debug(启用调试级别日志)
        • 日志格式spring.applog format=com.example.MyApplication>${request-global-start}\n(自定义日志格式)
        • 输出渠道spring.http://www.devze.comapplog channel=applog收集器(指定日志收集器)

        properties 和yml只需要配置其中⼀个即可

        ⼆者转换方法: Properties文件的点( . ) 对应yml文件中的换行

        2. 配置日志收集器

        使用 ELK Stack(Elasticsearch, Logstash, Kibanaphp)等工具可以将日志高效收集到云存储中,并进行分析。ELK Stack 是常用的日志分析工具,适用于大数据量的日志。

        3. 查看和分析日志

        配置完成后,可以通过以下命令查看日志:

        • logrotate:收集和旋转日志文件,确保存储空间有限时自动删除旧日志。
        • tail -f:实时查看日志文件的末尾部分。

        4.日志的持久化

        以上的日志都是输出在控制台上的, 然而在线上环境中, 我们需要把日志保存下来, 以便出现问题之后追溯问题. 把日志保存下来就叫持久化。

        日志持久化有两种方式:

        • 配置日志文件名
        • 配置日志的存储目录

        配置日志文件名:

        yml配置

        logging:
          file:
            name: log/log.log

        Spring Boot 日志配置与常见问题及解决方案

        运行结果显示, 日志内容保存在了对应的目录下。

        配置日志的保存路径

        yml

        logging:
          file:
            path:d/loggeController

        Spring Boot 日志配置与常见问题及解决方案

        可以看到日志在这个路径下面了。

        5.设置日志的颜色

        需要设置idea,让控制台中的日志有颜色

        1.打开启动配置, 添加VM options

        输入:

        -Dspring.output.ansi.enabled=ALWAYS

        Spring Boot 日志配置与常见问题及解决方案

        重新启动程序。

        Spring Boot 日志配置与常见问题及解决方案

        可以看到已经变颜色了。

        常见日志问题及解决方法

        1. 日志配置文件找不到

        问题:日志配置文件(如 application.properties)未找到或配置错误。

        解决方法

        • 检查 application.properties 文件是否存在。
        • 确保文件路径正确,例如在 src/main/resourcesapplication.conf 中。
        • 使用 mvn clean install 重新构建项目以确保配置文件被正确配置。

        2. 日志文件输出到错误的地方

        问题:日志文件被输出到不可见或错误的目录,导致日志无法查看。

        解决方法

        • 检查日志收集器的配置,确保输出目录正确。
        • 使用 mvn clean install 重新构建项目以确保配置文件被正确配置。

        3. 日志级别设置错误

        问题:日志级别设置过高或过低,导致日志内容被截断或显示不全。

        解决方法

        • 检查 application.properties 中的 spring.applog level 设置,确保级别正确。
        • 默认级别为 spring.applog level=error,可以调整为 warningnoticedebug

        4. 日志文件找不到

        问题:日志文件无法找到,导致日志记录失败。

        解决方法

        • 确保日志收集器配置正确,路径和文件名无误。
        • 检查日志文件的权限,确保应用程序有权限写入目标目录。
        • 使用 mvn clean install 重新构建项目以确保配置文件被正确配置。

        总结

        配置 Spring Boot 的日志有助于开发者更好地监控和分析应用程序。通过合理设置日志级别、格式和收集器,可以确保日志的完整性和有效性。遇到日志相关问题时,首先检查配置文件和日志收集器的配置,确保日志正常输出。如果问题依然存在,可以尝试重新构建项目或使用日志调试工具进一步排查问题。通过正确的日志配置和分析,开发者可以更高效地解决问题,提升应用程序的稳定性和性能。

        • 日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot 内容了日志框架,默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的
        • @Slf4j 注解和 log 对象快速的打印自定义日志.
        • 日志包含 6 个级别, 日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志持久化。

        到此这篇关于Spring Boot 日志配置与常见问题解析的文章就介绍到这了,更多相关Spring Boot 日志配置内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜