Spring 使用注解集成Log

原创 2015年11月19日 09:03:46
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface WesLogable {

}



@Component
@SuppressWarnings("serial")
public class WesLogAdvisor extends AbstractPointcutAdvisor {

	private final StaticMethodMatcherPointcut pointcut = new StaticMethodMatcherPointcut() {
		@Override
		public boolean matches(Method method, Class<?> targetClass) {
			return method.isAnnotationPresent(WesLogable.class);
		}
	};

	@Autowired
	private WesLogInterceptor interceptor;

	@Override
	public Pointcut getPointcut() {
		return this.pointcut;
	}

	@Override
	public Advice getAdvice() {
		return this.interceptor;
	}

}
@Component
public class WesLogInterceptor implements MethodInterceptor,Ordered {
	private Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());

	@Autowired
	private LogRepository logRepository;

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {
		long start = System.currentTimeMillis();
		String message = null;
		Timestamp startDate = new Timestamp(start);

		try {
			
			return invocation.proceed();
		} catch (WesException e) {
			message = e.getErrorMessage();
			throw e;
		}catch(Exception e){
			message = e.getMessage();
			throw e;
		} finally {
			long end = System.currentTimeMillis();
			after(invocation, end - start, message, startDate);
		}
	}

	private void after(MethodInvocation invocation, long duration, String message, Timestamp startDate) {
		Log log = prepareLogData(invocation, duration, message, startDate);
		persistLog(log);
	}

	private void persistLog(Log log) {
		logRepository.save(log);
	}

	private Log prepareLogData(MethodInvocation invocation, long duration, String message, Timestamp startDate) {
		Object[] arguments = getArgumentArray(invocation);
		Parameter[] parameters = invocation.getMethod().getParameters();

		String url = getUri(invocation);
		String urlData = null;
		String bodyData = null;
		String type = "in";

		HashMap<String, String> map = new HashMap<>();

		for (int i = 0; i < parameters.length; i++) {
			Parameter param = parameters[i];

			if (param.isAnnotationPresent(RequestBody.class)) {
				bodyData = arguments[i].toString();
				continue;
			} else {
				if(null != param && null != arguments[i]){
					map.put(param.getName(), arguments[i].toString());
				}
			}
		}

		urlData = JsonUtils.object2JsonStr(map);

		Log log = new Log();

		log.setDuration(duration);
		log.setMessage(message);
		log.setStartDate(startDate);
		log.setUrl(url);
		log.setType(type);
		log.setBodyData(bodyData);
		log.setUrlData(urlData);

		return log;
	}

	private String getUri(MethodInvocation invocation) {
		RequestMapping rm = invocation.getMethod().getAnnotation(RequestMapping.class);
		RequestMapping classRm = invocation.getThis().getClass().getAnnotation(RequestMapping.class);
		
		
		if (null != rm) {
			String url = rm.value()[0];
			
			if (null != classRm) {
				String classUrl = classRm.value()[0];
				url = classUrl + url;
			}
			
			return url;
		}
		
		return null;
	}

	private Object[] getArgumentArray(MethodInvocation invocation) {
		Object[] args = new Object[invocation.getArguments().length];
		for (int i = 0; i < args.length; i++) {
			args[i] = invocation.getArguments()[i];
			printArgumentValue(args[i]);
		}
		return args;
	}

	private void printArgumentValue(Object obj) {
		if (obj == null) {
			logger.info("    >>> Null");
		} else {
			logger.info("    >>> {}", obj.toString());
		}
	}

	@Override
	public int getOrder() {
		return 1;
	}

}

测试:

@WesLogable

public void testLog(String name, int age){

}

Spring + Aop+注解 集成使用 Log4j,实现异常日志记录

返回博客列表 转 Spring + Aop+注解 集成使用 Log4j,实现异常日志记录   岸芷汀兰 发布时间: 2015/09/18 14:55 阅读: 486 收藏: 11 点赞: ...

Spring集成Redis使用注解

Spring集成Redis,CacheEvict,Cacheable,CachePut,Caching

WebService之CXF+Spring集成(使用注解)

本文介绍CXF+Spring使用注解的集成,用到的接口等java类与XFire+Spring整合相同,不再给出,只给出配置信息。使用CXF版本为2.6.2,Spring为3.1.1,测试环境为Tomc...
  • sjepy
  • sjepy
  • 2013年07月03日 11:10
  • 7818

Mybatis3.2.1使用例二:Mapper方式集成Spring、注解提供SQL

Spring提供了非常出色的依赖注入功能,Mybatis也少不了要与它进行集成;不过Spring并没有提供相应的集成方式,而是由Mybatis提供了mybatis-spring-x.x.x.jar的包...

关于spring与struts2使用Annotion注解方式的集成

参考http://www.iteye.com/problems/79605  spring的配置: 1.classpath*:spring.xml http://www.sp...
  • yan_dk
  • yan_dk
  • 2012年12月08日 21:40
  • 2485

WebService之XFire+Spring集成(使用注解)

WebService之XFire+Spring集成(使用注解) 分类: 新的征程 2012-06-11 15:57 253人阅读 评论(0) 收藏 举报         ...

DWR高级主题之DWR与spring集成(使用springMVC,非注解的实例)

DWR高级主题之DWR与spring集成(使用springMVC,非注解的实例) ----------- web.xml:
  • fhd001
  • fhd001
  • 2011年12月22日 14:55
  • 1891

DWR3与spring集成(不使用springMVC,但使用注解的实例)

web.xml

DWR高级主题之DWR与spring集成(使用springMVC,并使用注解的实例)

DWR高级主题之DWR与spring集成(使用springMVC,并使用注解的实例) ---------- web.xml ...
  • fhd001
  • fhd001
  • 2011年12月22日 15:06
  • 1617

DWR高级主题之DWR与spring集成(不使用springMVC,不使用注解的实例)

DWR高级主题之DWR与spring集成(不使用springMVC,不使用注解的实例) ---------- web.xml ...
  • fhd001
  • fhd001
  • 2011年12月22日 15:14
  • 1109
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring 使用注解集成Log
举报原因:
原因补充:

(最多只允许输入30个字)