package com.nanjing.water.host.api; import com.google.common.base.Charsets; import com.nanjing.water.common.enums.ELogger; import com.nanjing.water.common.enums.EResultCode; import com.nanjing.water.common.ExecutedResult; import com.nanjing.water.common.exceptions.BusinessException; import com.nanjing.water.common.util.HttpUtil; import com.nanjing.water.common.util.LocalDateTimeUtil; import com.nanjing.water.common.util.LoggerUtil; import com.nanjing.water.common.util.SerializeUtil; import org.slf4j.Logger; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; /** * 全局异常处理 */ @ControllerAdvice public class GlobalExceptionHandler { private static final Logger sysLogger = LoggerUtil.get(ELogger.SYS_ERROR); private static final Logger logger = LoggerUtil.get(ELogger.API_REQUEST); @ResponseBody @ExceptionHandler(value = Exception.class) public ExecutedResult handle(Exception e) { ExecutedResult result = new ExecutedResult<>(EResultCode.ERROR, "", e.getMessage()); // 记录请求日志 this.writeLog(result); sysLogger.error("SysError", e); return result; } @ResponseBody @ExceptionHandler(value = BusinessException.class) public ExecutedResult handle(BusinessException e) { ExecutedResult result = new ExecutedResult<>(e.getCode(), "", e.getMessage()); // 记录请求日志 this.writeLog(result); return result; } private void writeLog(ExecutedResult result) { //获取当前请求对象 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (null == attributes) { return; } HttpServletRequest request = attributes.getRequest(); String data; try { byte[] buffer = HttpUtil.getBytesFromInputStream(request.getInputStream()); data = new String(buffer, Charsets.UTF_8); } catch (Exception e) { data = ""; } ApiRequestLogDTO webLog = HttpRequestLogPool.getRequestInfo(); if (null == webLog) { return; } String log = String.format("[%s]" + "%nrequestPath: %s[%s]" + "%nreponseData: %s" + "%nrequestTime: %s" + "%nresponseTime: %s" + "%nspendTime: %s" + "%nmethod: %s" + "%nrequestIp: %s" + "%ntokenCode: %s" + "%nrequestData: %s", "", webLog.getPath(), "", SerializeUtil.toJson(result), LocalDateTimeUtil.toFormatFullString(webLog.getRequestTime()), LocalDateTimeUtil.nowDateTimeFullStr(), LocalDateTimeUtil.nowTimeStamp() - webLog.getRequestTime(), webLog.getMethod(), webLog.getRequestIP(), webLog.getRequestToken(), data ); logger.info(log); } }