当前位置: 首页 > article >正文

Spring Boot 中异常日志记录的最佳实践:实时示例

异常日志记录是构建弹性且可维护的 Spring Boot 应用程序的关键方面。有效的日志记录不仅有助于解决问题,还有助于监控应用程序的运行状况。本文通过实时示例解释了 Spring Boot 中异常日志记录的最佳实践。

1.记录足够的上下文信息

记录异常时,必须捕获足够的上下文信息以了解错误的情况。这包括异常消息、堆栈跟踪以及相关的应用程序状态或参数。Spring Boot 提供了多种有效记录异常的方法。

示例:用于@ControllerAdvice全局异常处理

Spring Boot@ControllerAdvice允许您在一个全局位置处理整个应用程序的异常。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;

@ControllerAdvice
public class GlobalExceptionHandler {

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

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {
        // 记录带有上下文信息的异常
        logger.error("Exception occurred: {}, Request Details: {}", ex.getMessage(), request.getDescription(false), ex);
        return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Object> handleIllegalArgumentException(IllegalArgumentException ex, WebRequest request) {
        // 记录特定异常
        logger.error("Invalid argument: {}, Request Details: {}", ex.getMessage(), request.getDescription(false), ex);
        return new ResponseEntity<>("Invalid argument", HttpStatus.BAD_REQUEST);
    }
}

在此示例中:

  • 我们记录异常消息、堆栈跟踪和请求详细信息以提供完整的上下文。
  • 可以有针对性地处理不同类型的异常,确保准确记录并做出适当的响应。

2. 使用适当的日志级别

选择正确的日志级别对于有效记录至关重要。日志级别应反映问题的严重性。

示例:使用 Logback 配置日志级别

Spring Boot 使用 Logback 作为默认日志框架。您可以在application.yml或 中配置日志级别application.properties

logging:
  level:
    root: INFO
    com.example.yourpackage: DEBUG
    org.springframework.web: ERROR

在此配置中:

  • 根记录器设置为INFO级别。
  • 特定的包,例如您的应用程序包,可以有不同的日志级别(DEBUG在本例中)。
  • Spring框架日志设置为ERROR级别以减少无用提示。

不同级别的日志示例 

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ExampleController {

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

    @GetMapping("/test")
    public String testLogging() {
        try {
            // 模拟错误
            throw new RuntimeException("Test exception");
        } catch (RuntimeException e) {
            // 不同级别设置
            logger.debug("A debug message", e);
            logger.info("An informational message", e);
            logger.warn("A warning message", e);
            logger.error("An error message", e);
            throw e;
        }
    }
}

3. 集中化​​和标准化日志配置

集中化日志配置可确保一致性并简化管理。Spring Boot 的application.ymlapplication.properties可用于管理日志配置。

示例:集中式 Logback 配置

logback-spring.xml在您的目录中创建一个src/main/resources

<configuration>
    <property name="LOG_FILE" value="app.log"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_FILE}</file>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>app-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>

    <logger name="com.example.yourpackage" level="DEBUG"/>
    <logger name="org.springframework.web" level="ERROR"/>
</configuration>

在此配置中:

  • 日志以每日滚动的方式写入app.log
  • 根记录器设置为INFO
  • 特定的记录器具有定制的级别。

Java异常日志3条规则:

说到 Java 中的异常日志记录,有几种最佳实践可以显著提高应用程序的可维护性和故障排除能力。

请遵循以下三条重要规则:

1.记录足够的上下文信息

记录异常时,务必包含足够的上下文信息,以便了解发生了什么以及异常发生的原因。这些信息在诊断生产中的问题时非常有用。要包含的关键细节包括:

  • 异常消息:记录异常消息本身,提供错误的简要描述。
  • 堆栈跟踪:始终记录异常的堆栈跟踪。这显示了导致异常的方法调用顺序,有助于查明错误的确切位置和原因。
  • 参数和状态:包括导致异常的相关参数和状态信息。这可能包括方法参数、对象状态或任何其他有助于重现问题的上下文信息。

下面是使用该包记录具有足够上下文信息的异常的示例java.util.logging

import java.util.logging.*;

public class ExceptionLoggingExample {

    private static final Logger logger = Logger.getLogger(ExceptionLoggingExample.class.getName());

    public void doSomething() {
        try {
            // Code that may throw an exception
            throw new IllegalArgumentException("Invalid argument provided");
        } catch (IllegalArgumentException e) {
            // Log the exception with sufficient context information
            logger.log(Level.SEVERE, "An error occurred: " + e.getMessage(), e);
        }
    }

    public static void main(String[] args) {
        ExceptionLoggingExample example = new ExceptionLoggingExample();
        example.doSomething();
    }
}

在此示例中:

  • 我们抓到了一只IllegalArgumentException
  • 我们记录异常消息(e.getMessage())、堆栈跟踪(e)和自定义消息("An error occurred: ")。

2. 使用适当的日志级别

根据异常的严重程度及其对应用程序的影响选择适当的日志级别:

  • 严重:用于需要立即关注的严重错误,可能表明当前操作出现故障。
  • 警告:用于可恢复的意外情况或如果不解决可能会导致错误的情况。
  • INFODEBUG:用于不太严重的异常或仅供参考。这些可能包括已处理的异常或正常操作中的事件。

使用正确的日志级别可确保日志既具有信息量又具有可操作性,并且不会使日志文件充斥着不必要的细节。

3. 集中化​​和标准化日志配置

集中化和标准化日志配置可简化管理并确保整个应用程序的一致性。请考虑以下做法:

  • 使用日志框架:使用 Log4j、Logback 或 java.util.logging 等日志框架可获得更高级的日志功能和灵活性。
  • 配置日志级别:为不同的包和类设置适当的日志级别,以控制日志输出的详细程度。
  • 将日志输出到集中位置:将日志存储在集中位置或使用日志聚合服务(例如,ELK stack,Splunk)以便于监控和分析。
  • 处理日志记录故障:确保围绕日志记录操作进行强大的错误处理,以防止日志记录本身遇到问题时发生级联故障。

以下是使用 Log4j 进行日志记录的基本示例:

import org.apache.logging.log4j.LogManager;
import o​​rg.apache.logging.log4j.Logger; 

public  class  Log4jExample { 

    private  static  final  Logger  logger  = LogManager.getLogger(Log4jExample.class); 

    public  void  doSomething () { 
        try { 
            // 可能引发异常的代码
            throw  new  NullPointerException ( "遇到空值" ); 
        } catch (NullPointerException e) { 
            // 使用 Log4j 记录异常
            logger.error( "发生错误:{}" , e.getMessage(), e); 
        } 
    } 

    public  static  void  main (String[] args) { 
        Log4jExample  example  =  new  Log4jExample (); 
        example.doSomething(); 
    } 
}

在此示例中:

  • 我们使用 Log4j 进行日志记录。
  • 我们记录一个NullPointerException错误级别(logger.error),提供异常消息和异常本身。

通过遵循这些规则,您可以确保异常日志记录有效、信息丰富,并有助于诊断和解决 Java 应用程序中的问题。

结论

Spring Boot 中有效的异常日志记录包括捕获足够的上下文信息、使用适当的日志级别以及集中日志记录配置。这些做法可确保您的应用程序日志可用于监视、故障排除和维护应用程序。通过遵循这些最佳实践,您可以显著提高 Spring Boot 应用程序的可观察性和可靠性。


http://www.kler.cn/a/443358.html

相关文章:

  • 腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏
  • iOS - AutoreleasePool
  • uniapp vue2版本如何设置i18n
  • reducer同步,dispatch异步
  • Solidity合约编写(五)
  • uniapp 导入uview-plus,使用组件出现,页面出现<up-parse>元素不存在,请检查你的代码
  • .NET Runtime 是什么?
  • DNS协议 是什么?说说DNS 完整的查询过程?
  • 矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例(中英双语)
  • 使用 Django 和 AWS 实现自动同步 ECR 信息
  • 《算法ZUC》题目
  • C++算法第十一天
  • Scala快速入门+示例
  • html <a>设置发送邮件链接、打电话链接 <a href=“mailto:></a> <a href=“tel:></a>
  • 网页核心页面设计(第10章)
  • C语言:排序
  • uniapp v-tabs修改了几项功能,根据自己需求自己改
  • Java原生实现代码沙箱的实现
  • 中阳科技:从量化交易到智能金融的创新实践
  • go 中使用redis 基础用法
  • 工具篇-postman快速导入全局变量设置简单压测
  • 如何在window 使用 conda 环境下载大模型
  • VUE+Node.js+mysq实现响应式个人博客|项目初始化+路由配置+基础组件搭建
  • Pikachu-XXE靶场(注入攻击)
  • Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
  • Jest 入门指南:从零开始编写 JavaScript 单元测试