1、日誌切面實現以下前端
Spring的切面配置網上一大堆就不解釋了,直接上代碼,以下java
package com.yudian.mall.common.log; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; 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.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import com.yudian.mall.common.Environment; @Aspect @Component public class GloberLogInterceptor { @Value("${environment}") private String environment; @Resource private HttpServletRequest request; public Log log = LogFactory.getLog(GloberLogInterceptor.class); @Pointcut("execution(* com.yudian.mall.controller*..*(..))") public void log() { log.info(request.getParameterMap()); } @Before("log()") public void before(JoinPoint joinPoint) { if (StringUtils.equals(environment, Environment.DEV)) { StringBuilder sb = new StringBuilder("\nSpringMVC action report -------- ") .append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())) .append(" ------------------------------\n"); sb.append("Controller : ").append(joinPoint.getTarget().getClass().getName()).append(".(") .append(joinPoint.getTarget().getClass().getSimpleName()).append(".java:1)"); sb.append("\nMethod : ").append(joinPoint.getSignature().getName()).append("\n"); String uri = request.getRequestURI(); if (uri != null) { sb.append("url : ").append(uri).append("\n"); } Enumeration<String> e = request.getParameterNames(); if (e.hasMoreElements()) { 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(" "); } sb.append("\n"); } sb.append("--------------------------------------------------------------------------------\n"); System.out.print(sb.toString()); } else { StringBuilder sb = new StringBuilder(); sb.append(request.getRequestURI()).append(", "); sb.append("IP: " + request.getRemoteAddr()).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()); } } @AfterReturning(pointcut = "log()", returning = "returnValue") public void afterReturning(JoinPoint joinPoint, Object returnValue) { log.info("return value is "+returnValue); } }
執行效果以下mysql
GloberLogInterceptor - return value is /login/login SpringMVC action report -------- 2016-11-10 11:33:48 ------------------------------ Controller : com.yudian.mall.controller.LoginController.(LoginController.java:1) Method : checkLogin url : /login/checkLogin Parameter : userName=admin password=123456 -------------------------------------------------------------------------------- AbstractPoolBackedDataSource - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 5, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge2ye9kl640vhtdbppg|3cb3ada, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge2ye9kl640vhtdbppg|3cb3ada, idleConnectionTestPeriod -> 60, initialPoolSize -> 20, jdbcUrl -> jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 600, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 100, maxStatements -> 5, maxStatementsPerConnection -> 0, minPoolSize -> 10, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ] LoginController - user admin login success GloberLogInterceptor - return value is {"code":"1","message":"登陸成功"} SpringMVC action report -------- 2016-11-10 11:33:48 ------------------------------ Controller : com.yudian.mall.controller.IndexController.(IndexController.java:1) Method : index url : / -------------------------------------------------------------------------------- GloberLogInterceptor - return value is index SpringMVC action report -------- 2016-11-10 11:33:49 ------------------------------ Controller : com.yudian.mall.controller.user.PermissionController.(PermissionController.java:1) Method : findMenu url : /permission/get-menu Parameter : module=sys -------------------------------------------------------------------------------- GloberLogInterceptor - return value is {"code":"成功獲取菜單","message":"1","data":[{"id":1,"parentId":0,"checked":false,"children":[{"id":2,"parentId":1,"url":"/admin","checked":false,"children":[],"text":"用戶管理"},{"id":3,"parentId":1,"url":"/department","checked":false,"children":[],"text":"組織管理"},{"id":4,"parentId":1,"url":"/role","checked":false,"children":[],"text":"角色管理"},{"id":5,"parentId":1,"url":"/permission","checked":false,"children":[],"text":"權限菜單"}],"text":"系統配置"}]}
是否是很直觀,不再問前端,你傳了參數沒有,哈哈spring