spring mvc通過aop在控制檯列印log日誌,包含請求controller、method、url、remoteaddr、返回值,方便除錯
阿新 • • 發佈:2019-02-05
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