一、日志切面实现如下
Spring的切面配置网上一大堆就不解释了,直接上代码,如下
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);
}
}
执行效果如下
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":"系统配置"}]}
是不是很直观,再也不问前端,你传了参数没有,哈哈