Spring Boot全局异常处理与日志监控实战指南

引言

在微服务架构中,统一的异常处理和完善的日志监控是保障系统稳定性的基石。本文将结合Spring Boot特性,详细讲解如何实现:

  1. 自定义全局异常处理器
  2. Logback日志框架的精细化配置
  3. 异常与日志的联动监控机制

一、全局异常处理体系构建

1.1 自定义异常类设计

java 复制代码
public class BusinessException extends RuntimeException {
    private final int code;

    public BusinessException(String message, int code) {
        super(message);
        this.code = code;
    }

    // Getter...
}

1.2 全局异常处理器实现

java 复制代码
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException ex, HttpServletRequest request) {
        log.error("业务异常: {} - URL: {}", ex.getMessage(), request.getRequestURI());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body(new ErrorResponse(ex.getCode(), ex.getMessage()));
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleGlobalException(Exception ex, HttpServletRequest request) {
        log.error("系统异常: {} - URL: {}", ex.getMessage(), request.getRequestURI(), ex);
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(new ErrorResponse(500, "服务器内部错误"));
    }
}

1.3 统一响应结构

java 复制代码
@Data
public class ErrorResponse {
    private int code;
    private String message;
    private long timestamp = System.currentTimeMillis();
}

二、Logback日志框架配置详解

2.1 基础配置文件(logback-spring.xml)

xml 复制代码
<configuration>
    <property name="LOG_PATH" value="./logs/app"/>
    
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 文件输出 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 环境区分配置 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>

    <springProfile name="prod">
        <root level="WARN">
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>
</configuration>

2.2 高级配置技巧

  1. MDC线程上下文
java 复制代码
MDC.put("traceId", UUID.randomUUID().toString());
log.info("处理业务请求");
MDC.clear();
  1. 异步日志
xml 复制代码
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
    <discardingThreshold>0</discardingThreshold>
    <queueSize>512</queueSize>
    <appender-ref ref="FILE"/>
</appender>
  1. 日志过滤
xml 复制代码
<logger name="com.example.敏感包" level="ERROR" additivity="false"/>

三、异常与日志联动监控

3.1 告警日志识别模式

regex 复制代码
.*系统异常.*|.*BusinessException.*|.*TimeoutException.*

3.2 集成监控系统示例(伪代码)

java 复制代码
@Aspect
@Component
public class LogMonitorAspect {
    
    @Around("execution(* com.example.controller..*.*(..))")
    public Object monitorLog(ProceedingJoinPoint joinPoint) {
        try {
            return joinPoint.proceed();
        } catch (Throwable ex) {
            if (ex instanceof BusinessException) {
                sendAlert("业务异常告警", ex.getMessage());
            }
            throw ex;
        }
    }
}

四、最佳实践建议

  1. 分级日志策略

    • 开发环境:DEBUG+INFO
    • 测试环境:INFO+WARN
    • 生产环境:WARN+ERROR
  2. 日志保留策略

    • 开发环境:7天
    • 生产环境:30天(热数据)+ 1年(冷数据)
  3. 性能优化

    • 使用参数化日志避免字符串拼接
    • 合理设置异步日志队列大小
    • 生产环境禁用CONSOLE输出

总结

通过构建全局异常处理体系与精细化日志监控方案,可实现:

  1. 接口返回标准化错误信息
  2. 快速定位系统问题根源
  3. 满足合规性审计要求
  4. 为监控告警系统提供数据基础

文章特点

  1. 完整代码示例与配置文件

  2. 生产环境经验总结

  3. 异常与日志的联动设计

  4. 不同环境配置差异化处理

  5. 性能优化建议

可根据实际项目需求调整日志输出格式、存储策略和监控告警规则。