使用 @restcontrolleradvice 配合自定义的 exceptionhandler 可以捕获日志采集过程中的异常。核心做法是定义一个处理特定异常类型(如 ioexception 或业务封装的 logexception)的方法,并在方法内部记录错误日志,同时返回统一的错误响应结构,确保前端或调用方能感知到采集失败。

如何配置全局异常处理器拦截日志写入异常
通过继承 ResponseEntityExceptionHandler 或直接使用 @RestControllerAdvice 注解类,并重写针对 IOException 的处理方法,可以拦截底层流操作抛出的异常。在处理方法中,利用 Logger 记录堆栈信息,并构建包含错误码和提示信息的 JSON 响应体,从而将原始异常转化为标准的 HTTP 500 或自定义状态码响应。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(IOException.class)
public ResponseEntity<map object>> handleIOException(IOException ex) {
logger.error("日志采集 IO 异常", ex);
Map<string object> body = new HashMap();
body.put("code", 500);
body.put("message", "日志写入失败,请稍后重试");
return ResponseEntity.status(500).body(body);
}
}</string></map>
如何处理非 IO 类的业务逻辑采集异常
对于序列化失败、数据校验不通过等非 I/O 异常,需要定义专门的异常类(如 LogProcessException)并在 @RestControllerAdvice 中单独声明 @ExceptionHandler。这种方式允许针对不同阶段的错误提供不同的提示信息,例如区分“格式错误”和“服务不可用”,从而更精准地指导客户端进行重试或修正输入。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class LogExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(LogExceptionHandler.class);
@ExceptionHandler(LogProcessException.class)
public ResponseEntity<map object>> handleLogProcessException(LogProcessException ex) {
logger.warn("日志处理业务异常: {}", ex.getMessage());
Map<string object> body = new HashMap();
body.put("code", 400);
body.put("message", ex.getMessage());
return ResponseEntity.badRequest().body(body);
}
}</string></map>
当日志采集线程池满时程序会抛出什么异常
如果日志采集依赖的线程池队列已满且拒绝策略为默认行为,程序会抛出 RejectedExecutionException。在全局异常处理器中,应当显式捕获该异常,避免其导致主线程崩溃,同时记录线程池状态以便运维排查容量问题。











