引言
在微服务架构中,统一的异常处理和完善的日志监控是保障系统稳定性的基石。本文将结合Spring Boot特性,详细讲解如何实现:
- 自定义全局异常处理器
- Logback日志框架的精细化配置
- 异常与日志的联动监控机制
一、全局异常处理体系构建
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 高级配置技巧
- MDC线程上下文:
java
MDC.put("traceId", UUID.randomUUID().toString());
log.info("处理业务请求");
MDC.clear();
- 异步日志:
xml
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>512</queueSize>
<appender-ref ref="FILE"/>
</appender>
- 日志过滤:
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;
}
}
}
四、最佳实践建议
-
分级日志策略:
- 开发环境:DEBUG+INFO
- 测试环境:INFO+WARN
- 生产环境:WARN+ERROR
-
日志保留策略:
- 开发环境:7天
- 生产环境:30天(热数据)+ 1年(冷数据)
-
性能优化:
- 使用参数化日志避免字符串拼接
- 合理设置异步日志队列大小
- 生产环境禁用CONSOLE输出
总结
通过构建全局异常处理体系与精细化日志监控方案,可实现:
- 接口返回标准化错误信息
- 快速定位系统问题根源
- 满足合规性审计要求
- 为监控告警系统提供数据基础
文章特点 :
-
完整代码示例与配置文件
-
生产环境经验总结
-
异常与日志的联动设计
-
不同环境配置差异化处理
-
性能优化建议
可根据实际项目需求调整日志输出格式、存储策略和监控告警规则。