1、创建标签
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(value = ElementType.METHOD) @Retention(value = RetentionPolicy.RUNTIME) @Documented public @interface Log { String action() default ""; String description() default ""; }2、创建切面
import java.lang.reflect.Method; import java.util.Date; import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import com.freemarker.util.DateUtils; /** * spring切面 请求日志 * * @author 96315 * */ @Aspect @Component public class RequestLogger { private static Logger logger = Logger.getLogger(RequestLogger.class); @Pointcut("execution(* com..*Controller.*(..))") public void controllerAspect() { }; /** * 请求记录 * @param point */ @AfterReturning(pointcut = "controllerAspect()", returning = "r") public void log(final JoinPoint point) { handleLog(point,null); } /** * 日志--异常处理 */ @AfterThrowing(pointcut = "controllerAspect()", throwing = "e") public void afterThrowing(JoinPoint joinPoint, Exception e) { handleLog(joinPoint,e); } /** * 日志处理,存入数据库 */ private void handleLog(JoinPoint joinPoint, Exception e) { try { //获取注解标签 Log log = getLog(joinPoint); if (log == null) {//无注解标签 return; } if (logger.isDebugEnabled()) { StringBuffer sb = new StringBuffer(); sb.append("\n"); sb.append("时间:"); sb.append(DateUtils.format(new Date(System.currentTimeMillis()),DateUtils.YYYY_MM_DD_HH_MM_SS)); sb.append("\n"); sb.append("请求:"); sb.append(log.action()); sb.append("\n"); // sb.append("用户:"); // sb.append(AuthcUtils.getAuth().getUsername()); // sb.append("\n"); sb.append("方法:"); sb.append(joinPoint.getSignature()); sb.append("\n"); sb.append("描述:"); sb.append(log.description()); sb.append("\n"); if (e != null) { sb.append("异常:"); sb.append(e.getMessage()); sb.append("\n"); logger.error(sb.toString()); }else{ logger.info(sb.toString()); } } } catch (Exception ex) { ex.printStackTrace(); logger.error("日志记录异常:\n"+ex.getMessage()); } } /** * 是否存在注解,如果存在就记录日志 * @param joinPoint * @return * @throws Exception */ private static Log getLog(JoinPoint joinPoint) throws Exception { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) { return method.getAnnotation(Log.class); } return null; } }3、Spring配置
<!-- 声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面 --> <aop:aspectj-autoproxy proxy-target-class="true" /> <!-- 自动扫描路径 --> <context:component-scan base-package="com.freemarker.aspect.log" />