liulin
2024-07-30 ce04dfcdd664df7e791a63800cab2cd2d12e878c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package com.lunhan.xxx.host.api;
 
import com.google.common.base.Charsets;
import com.lunhan.xxx.common.enums.ELogger;
import com.lunhan.xxx.common.enums.EResultCode;
import com.lunhan.xxx.common.ExecutedResult;
import com.lunhan.xxx.common.exceptions.BusinessException;
import com.lunhan.xxx.common.util.*;
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<String> handle(Exception e) {
        ExecutedResult<String> result = new ExecutedResult<>(EResultCode.ERROR, "", e.getMessage());
 
        // 记录请求日志
        this.writeLog(result);
 
        sysLogger.error("SysError", e);
        return result;
    }
 
 
    @ResponseBody
    @ExceptionHandler(value = BusinessException.class)
    public ExecutedResult<String> handle(BusinessException e) {
        ExecutedResult<String> result = new ExecutedResult<>(e.getCode(), "", e.getMessage());
 
        // 记录请求日志
        this.writeLog(result);
 
        return result;
    }
 
    private void writeLog(ExecutedResult<String> 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);
    }
}