新增:新增系统监控/登录日志功能,优化日志表结构,并新增记录错误信息(非未知异常不记录异常详情,只记录错误信息)

This commit is contained in:
2023-01-17 23:16:37 +08:00
parent aa726fc6b6
commit c57383abad
28 changed files with 711 additions and 187 deletions

View File

@@ -41,7 +41,6 @@ import cn.hutool.core.util.StrUtil;
import top.charles7c.cnadmin.common.exception.BadRequestException;
import top.charles7c.cnadmin.common.exception.ServiceException;
import top.charles7c.cnadmin.common.model.dto.LogContext;
import top.charles7c.cnadmin.common.model.vo.R;
import top.charles7c.cnadmin.common.util.ExceptionUtils;
import top.charles7c.cnadmin.common.util.StreamUtils;
@@ -63,8 +62,8 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public R handleException(Exception e, HttpServletRequest request) {
this.setException(e);
log.error("请求地址'{}',发生未知异常", request.getRequestURI(), e);
LogContextHolder.setException(e);
return R.fail(e.getMessage());
}
@@ -74,8 +73,8 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(RuntimeException.class)
public R handleRuntimeException(RuntimeException e, HttpServletRequest request) {
this.setException(e);
log.error("请求地址'{}',发生系统异常", request.getRequestURI(), e);
LogContextHolder.setException(e);
return R.fail(e.getMessage());
}
@@ -85,8 +84,8 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(ServiceException.class)
public R handleServiceException(ServiceException e, HttpServletRequest request) {
this.setException(e);
log.error("请求地址'{}',发生业务异常", request.getRequestURI(), e);
LogContextHolder.setErrorMsg(e.getMessage());
return R.fail(HttpStatus.INTERNAL_SERVER_ERROR.value(), e.getMessage());
}
@@ -97,6 +96,7 @@ public class GlobalExceptionHandler {
@ExceptionHandler(BadRequestException.class)
public R handleBadRequestException(BadRequestException e, HttpServletRequest request) {
log.error("请求地址'{}',自定义验证失败", request.getRequestURI(), e);
LogContextHolder.setErrorMsg(e.getMessage());
return R.fail(HttpStatus.BAD_REQUEST.value(), e.getMessage());
}
@@ -107,8 +107,9 @@ public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
public R handleBindException(BindException e, HttpServletRequest request) {
log.error("请求地址'{}',参数验证失败", request.getRequestURI(), e);
String message = StreamUtils.join(e.getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, "");
return R.fail(HttpStatus.BAD_REQUEST.value(), message);
String errorMsg = StreamUtils.join(e.getAllErrors(), DefaultMessageSourceResolvable::getDefaultMessage, "");
LogContextHolder.setErrorMsg(errorMsg);
return R.fail(HttpStatus.BAD_REQUEST.value(), errorMsg);
}
/**
@@ -118,8 +119,9 @@ public class GlobalExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public R constraintViolationException(ConstraintViolationException e, HttpServletRequest request) {
log.error("请求地址'{}',参数验证失败", request.getRequestURI(), e);
String message = StreamUtils.join(e.getConstraintViolations(), ConstraintViolation::getMessage, "");
return R.fail(HttpStatus.BAD_REQUEST.value(), message);
String errorMsg = StreamUtils.join(e.getConstraintViolations(), ConstraintViolation::getMessage, "");
LogContextHolder.setErrorMsg(errorMsg);
return R.fail(HttpStatus.BAD_REQUEST.value(), errorMsg);
}
/**
@@ -129,8 +131,10 @@ public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e, HttpServletRequest request) {
log.error("请求地址'{}',参数验证失败", request.getRequestURI(), e);
return R.fail(HttpStatus.BAD_REQUEST.value(), ExceptionUtils
.exToNull(() -> Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage()));
String errorMsg = ExceptionUtils
.exToNull(() -> Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage());
LogContextHolder.setErrorMsg(errorMsg);
return R.fail(HttpStatus.BAD_REQUEST.value(), errorMsg);
}
/**
@@ -143,6 +147,7 @@ public class GlobalExceptionHandler {
String subMsg = StrUtil.format("参数名:'{}',期望参数类型:'{}'", e.getName(), e.getParameter().getParameterType());
log.error("请求地址'{}',参数转换失败。方法:'{}'{}", request.getRequestURI(),
Objects.requireNonNull(e.getParameter().getMethod()).getName(), subMsg, e);
LogContextHolder.setErrorMsg(subMsg);
return R.fail(HttpStatus.BAD_REQUEST.value(), subMsg);
}
@@ -152,6 +157,7 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public R handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e, HttpServletRequest request) {
LogContextHolder.setErrorMsg(e.getMessage());
log.error("请求地址'{}',不支持'{}'请求", request.getRequestURI(), e.getMethod());
return R.fail(HttpStatus.METHOD_NOT_ALLOWED.value(), e.getMessage());
}
@@ -163,7 +169,9 @@ public class GlobalExceptionHandler {
@ExceptionHandler(NotLoginException.class)
public R handleNotLoginException(NotLoginException e, HttpServletRequest request) {
log.error("请求地址'{}',认证失败,无法访问系统资源", request.getRequestURI(), e);
return R.fail(HttpStatus.UNAUTHORIZED.value(), "登录状态已过期,请重新登录");
String errorMsg = "登录状态已过期,请重新登录";
LogContextHolder.setErrorMsg(errorMsg);
return R.fail(HttpStatus.UNAUTHORIZED.value(), errorMsg);
}
/**
@@ -172,22 +180,10 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MaxUploadSizeExceededException.class)
public R handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e, HttpServletRequest request) {
String sizeLimit = StrUtil.subBetween(e.getMessage(), "The maximum size ", " for");
log.error("请求地址'{}',上传文件失败,文件大小超过限制", request.getRequestURI(), e);
return R.fail(HttpStatus.BAD_REQUEST.value(),
String.format("请上传小于 %s MB 的文件", NumberUtil.parseLong(sizeLimit) / 1024 / 1024));
}
/**
* 在系统日志上下文中保存异常信息
*
* @param e
* 异常信息
*/
private void setException(Exception e) {
LogContext logContext = LogContextHolder.get();
if (logContext != null) {
logContext.setException(e);
}
String sizeLimit = StrUtil.subBetween(e.getMessage(), "The maximum size ", " for");
String errorMsg = String.format("请上传小于 %s MB 的文件", NumberUtil.parseLong(sizeLimit) / 1024 / 1024);
LogContextHolder.setErrorMsg(errorMsg);
return R.fail(HttpStatus.BAD_REQUEST.value(), errorMsg);
}
}

View File

@@ -40,7 +40,12 @@ public class LogContext {
private LocalDateTime createTime;
/**
* 异常
* 错误信息
*/
private String errorMsg;
/**
* 异常信息
*/
private Exception exception;
}

View File

@@ -57,4 +57,31 @@ public class LogContextHolder {
public static void remove() {
LOG_THREAD_LOCAL.remove();
}
/**
* 在系统日志上下文中保存异常信息
*
* @param e
* 异常信息
*/
public static void setException(Exception e) {
LogContext logContext = get();
if (logContext != null) {
logContext.setErrorMsg(e.getMessage());
logContext.setException(e);
}
}
/**
* 在系统日志上下文中保存错误信息(非未知异常不记录异常信息,只记录错误信息)
*
* @param errorMsg
* 错误信息
*/
public static void setErrorMsg(String errorMsg) {
LogContext logContext = get();
if (logContext != null) {
logContext.setErrorMsg(errorMsg);
}
}
}