1. 程式人生 > >spring mvc通過aop在控制檯列印log日誌,包含請求controller、method、url、remoteaddr、返回值,方便除錯

spring mvc通過aop在控制檯列印log日誌,包含請求controller、method、url、remoteaddr、返回值,方便除錯

1:匯入對應的包

在maven xml檔案中加入

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.9.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.1</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.7</version>
    </dependency>

2: 在spring-mvc.xml中加入

<!-- 啟動AspectJ支援   只對掃描過的bean有效-->
<aop:aspectj-autoproxy proxy-target-class="true" />

3:建立LogInterceptor檔案

package com.xcd.zc.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.xcd.zc.utils.CommonPropertyUtil;
import com.xcd.zc.utils.CommonUtils;
import com.xcd.zc.utils.JdkVersionUtil;
import org.apache.commons.lang.text.StrBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @Project : crowdfunding
 * @Program Name : com.xcd.zc.interceptor
 * @Description : 日誌管理
 * @Author : 關洪昌
 * @Creation Date :  2018/7/19  18:19
 * @Iteration : 1.23
 * @ModificationHistory who         when         what
 * 關洪昌      2018/7/19      create
 */
@Component
@Aspect
public class LogInterceptor {
    @Resource
    private HttpServletRequest request;

    public Log log = LogFactory.getLog(LogInterceptor.class);

    @Pointcut("execution(* com.xcd.zc.controller*..*(..))")
    public void log() {
        log.info(request.getParameterMap());
    }

    @AfterReturning(pointcut = "log()", returning = "returnValue")
    public void afterReturning(JoinPoint joinPoint, Object returnValue) {

        if (StringUtils.equals(CommonPropertyUtil.getProperty("environment"), "DEV")) {
            devEnvironmentLog(joinPoint, returnValue);
        } else {
            productEnvironmentLog(joinPoint, returnValue);
        }


    }

    /**
     * @Description: 開發環境console列印資訊
     * @Param:
     * @return:
     * @Author: 關洪昌
     * @Date: 2018/7/20
     */
    private void devEnvironmentLog(JoinPoint joinPoint, Object returnValue) {
        StringBuilder sb = new StringBuilder("\nSpringMVC action report -------- ")
                .append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))
                .append(" ------------------------------\n");
        sb.append(getController(joinPoint));
        sb.append(getMethod(joinPoint));
        sb.append(getUri());
        sb.append(getParameter(joinPoint));
        sb.append("RemoteAddr  : " + CommonUtils.getIpAddr(request) + "\n");
        sb.append(getReturn(returnValue));
        sb.append("--------------------------------------------------------------------------------\n");
        System.out.print(sb.toString());
    }

    /**
     * @Description: 正式環境列印的資訊
     * @Param:
     * @return:
     * @Author: 關洪昌
     * @Date: 2018/7/20
     */
    private void productEnvironmentLog(JoinPoint joinPoint, Object returnValue) {
        StringBuilder sb = new StringBuilder();

        sb.append(request.getRequestURI()).append(", ");
        sb.append("IP: " + CommonUtils.getIpAddr(request)).append(", [");

        Map<String, String[]> parameters = request.getParameterMap();

        for (Map.Entry<String, String[]> entity : parameters.entrySet()) {

            sb.append(String.format("%s = %s, ", entity.getKey(), StringUtils.join(entity.getValue(), ',')));
        }

        sb.delete(sb.length() - 2, sb.length()).append("]");

        log.info(sb.toString());
    }

    private Map<String, MultipartFile> getRequestFileMap(JoinPoint joinPoint) {
        Map<String, MultipartFile> fileMap = null;
        if (JdkVersionUtil.isJava8()) {
            Object[] args = joinPoint.getArgs();
            for (Object object : args) {
                if (object instanceof MultipartHttpServletRequest) {
                    MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) object;
                    fileMap = multipartHttpServletRequest.getFileMap();
                    break;
                }
            }
        }
        return fileMap;
    }


    private String getController(JoinPoint joinPoint) {
        return new StringBuffer().append("Controller  : ").append(joinPoint.getTarget().getClass().getName()).append(".(")
                .append(joinPoint.getTarget().getClass().getSimpleName()).append(".java:1)").toString();
    }

    private String getMethod(JoinPoint joinPoint) {
        return new StringBuffer().append("\nMethod      : ").append(joinPoint.getSignature().getName()).append("\n").toString();
    }

    private String getUri() {
        String uri = request.getRequestURI();
        if (uri != null) {
            return new StringBuffer().append("url         : ").append(uri)
                    .append(" user=" + request.getRemoteUser()).append("\n").toString();
        }
        return "";
    }

    private String getParameter(JoinPoint joinPoint) {
        StringBuffer sb = new StringBuffer();
        Map<String, MultipartFile> fileMap = getRequestFileMap(joinPoint);
        Enumeration<String> e = request.getParameterNames();
        if (e.hasMoreElements() || (fileMap != null && fileMap.size() > 0)) {
            sb.append("Parameter   : ");
            while (e.hasMoreElements()) {
                String name = e.nextElement();
                String[] values = request.getParameterValues(name);
                if (values.length == 1) {
                    sb.append(name).append("=").append(values[0]);
                } else {
                    sb.append(name).append("[]={");
                    for (int i = 0; i < values.length; i++) {
                        if (i > 0)
                            sb.append(",");
                        sb.append(values[i]);
                    }
                    sb.append("}");
                }
                sb.append("  ");
            }
            if (fileMap != null && fileMap.size() > 0) {
                for (Map.Entry<String, MultipartFile> entry : fileMap.entrySet()) {
                    MultipartFile file = entry.getValue();
                    sb.append(entry.getKey()).append("=").append(file.getOriginalFilename());
                    sb.append(" (contentType=" + file.getContentType() + ",size=" + file.getSize() + ")");
                    sb.append("  ");
                }
            }
            sb.append("\n");
        }
        return sb.toString();
    }

    private String getReturn(Object returnValue) {
        StringBuffer sb = new StringBuffer();
        String returnJSON = "";
        returnJSON = JSONObject.toJSONString(returnValue);
        sb.append("return      : " + returnJSON);
        sb.append("\n");
        return sb.toString();
    }


}

其中獲取ip地址的程式碼為

public static String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader( "x-forwarded-for" );
        if (ip == null || ip.length() == 0 || " unknown " .equalsIgnoreCase(ip)) {
            ip = request.getHeader( "Proxy-Client-IP" );
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader( "WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (ip.equals("0:0:0:0:0:0:0:1")){
            ip = "127.0.0.1";
        }
        return ip;
    }

最終執行列印的效果為:

SpringMVC action report -------- 2018-07-20 11:27:44 ------------------------------
Controller  : com.xcd.zc.controller.UserJoinController.(UserJoinController.java:1)
Method      : saveImg
url              : /userJoin/saveImg
Parameter  : id=1  userId=1  paymentCertificate=Penguins.jpg (contentType=image/jpeg,size=777835)  
RemoteAddr  : 127.0.0.1
return      : 1