public class UserRequestLogger extends BaseController {
private Logger logger = LoggerFactory.getLogger(UserRequestLogger.class);
public void loggerUserRequest(JoinPoint joinPoint) {
try {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
if (request == null) {
return;
}
String sessionId = null;
HttpSession session = request.getSession(false);
if (session != null) {
sessionId = session.getId();
}
String username = super.getCurrentUsername();
//此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
Object[] args = joinPoint.getArgs();
StringBuffer classUrl = new StringBuffer(request.getRequestURI());
StringBuffer classpath = new StringBuffer();
StringBuffer classvalue = new StringBuffer();
StringBuffer clValueOld = new StringBuffer();
try {
classpath.append(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
Method[] methods = joinPoint.getTarget().getClass().getDeclaredMethods();
for (Method method : methods) {
if (method == null) {
continue;
}
if (!method.getName().equals(joinPoint.getSignature().getName())) {
continue;
}
classpath.append("(");
boolean hasParam = false;
for (Class ss : method.getParameterTypes()) {
if (ss == null) {
continue;
}
classpath.append(ss.getName() + ",");
hasParam = true;
}
if (hasParam) {
classpath = new StringBuffer(classpath.substring(0, classpath.length() - 1)).append(")");
} else {
classpath.append(")");
}
break;
}
if (args != null && args.length > 0) {
for (Object object : args) {
if (object == null) {
continue;
}
Class clazz = object.getClass();// 获取集合中的对象类型
if (HttpServletRequest.class == clazz || javax.servlet.http.HttpServletResponse.class == clazz
|| clazz.toString().indexOf("org.springframework") >= 0) {
continue;
}
if (clazz.getDeclaredConstructors() != null && clazz.getDeclaredConstructors().length > 0) {
classvalue.append(clazz.getDeclaredConstructors()[0].getName() + "=");
}
if (String.class == clazz || Long.class == clazz || Boolean.class == clazz
|| Double.class == clazz || Integer.class == clazz || Short.class == clazz
|| Float.class == clazz) {
classvalue.append(object + ",");
} else {
Field[] fds = clazz.getDeclaredFields();// 获取他的字段数组
if (fds != null && fds.length > 0) {
classvalue.append("{");
for (Field field : fds) {// 遍历该数组
if (field == null) {
continue;
}
try {
String fdname = field.getName();// 得到字段名,
Method metd = clazz.getMethod("get" + change(fdname), null);// 根据字段名找到对应的get方法,null表示无参数
Object name = metd.invoke(object, null);// 调用该字段的get方法
if (name != null) {
classvalue.append(fdname + ":" + name + ",");
}
} catch (NoSuchMethodException e) {
} catch (SecurityException e) {
} catch (IllegalAccessException e) {
} catch (IllegalArgumentException e) {
} catch (InvocationTargetException e) {
}
}
classvalue = new StringBuffer(classvalue.substring(0, classvalue.length() - 1)).append("},");
}
}
}
}
} catch (SecurityException e) {
e.printStackTrace();
logger.error("error:====inner error=====" + e.getMessage());
}
StringBuffer logStr = new StringBuffer(username + "|" + IPUtil.getIpAddr(request) + "|" + "|" + sessionId + "|");
logStr.append(classUrl).append("|").append(classvalue);
logger.info(logStr.toString());
} catch (Exception e) {
e.printStackTrace();
logger.error("error:====error==============" + e.getMessage());
}
}
/**
* @param src 源字符串
* @return 字符串,将src的第一个字母转换为大写,src为空时返回null
*/
private static String change(String src) {
if (src != null) {
StringBuffer sb = new StringBuffer(src);
sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
return sb.toString();
} else {
return null;
}
}
}
//配置
<!--aop用户请求日志-->
<aop:config>
<aop:pointcut id="userLoggerPointcut" expression="execution(* com.xxx.web.controller.*.*(..))"/>
<aop:aspect id="loggerAspect" ref="genericLoggerBean">
<aop:around pointcut-ref="userLoggerPointcut" method="loggerUserRequest"/>
</aop:aspect>
</aop:config>
<bean id="genericLoggerBean"
class="com.xxx.web.aop.UserRequestLogger">
</bean>
//效果
13:51:28.820 - 【13400000000】【192.168.1.2】【BB3F6A48072070D85403A59E4EFB0715】【/androidIos/listQianbaoGotPerson.html】【com.xxx.web.controller.AndroidIosController.listQianbaoGotPerson(com.xxx.view.PaginationView,int)】【com.hyip.view.PaginationView={iTotalRecords:0,iTotalDisplayRecords:0},java.lang.Integer=1】
分享到:
相关推荐
Spring_AOP_before的使用
java spring aop log java spring aop log
AOP能够做到这一点,让开发人员更加专注于系统的业务编码,而无需顾虑日志问题(这一点大家可以联系声明式事务处理的方式,配置好了处理事务的配置文件,编写Manager或者action时,都无需顾虑事务)
使用springmvc,利用aop aspectj log4j 实现进入函数,退出函数的日志的记录
顾名思义,Before Advice会在目标对象的方法执行之前被调用,您可以通过实现org.springframework.aop.MethodBeforeAdvice接口来实现Before Advice的逻辑,接口定义如下: java 代码 1. package org.spring...
主要介绍了Spring AOP定义Before增加,结合实例形式详细分析了Spring面向切面AOP定义Before增加相关定义与使用技巧,需要的朋友可以参考下
NULL 博文链接:https://tgwall163.iteye.com/blog/1487701
aop记录log
Spring Boot项目中使用Logback日志与使用AOP拦截请求日志信息
Spring MVC AOP通过自定义注解方式拦截Controller等实现日志管理, springMVC里做添加AOP拦截,用于捕获异常。
ssh+aop+log4j+日志拦截器+注解
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
该源码是课程 Java Spring案例精讲 ---- Spring框架 的源码,包含Java Spring的最简单的Hello World、IOC、AOP及Log的源码 Spring整体框架中的核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等...
NULL 博文链接:https://miaoxianjie.iteye.com/blog/2067308
写这个日志的框架的主要想法是,先前在开发的时候logger都是到处都有不便于管理,于是想到了利用AOP加注解的方式统一管理,异常主要分为业务异常和系统异常, 业务异常应该由程序员在写业务的时候在可能发生业务异常...
演示了spring对aop的before、after、throw、around几种advice的api操作。
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
主要介绍了Spring Boot2集成AOPLog来记录接口访问日志,日志是一个Web项目中必不可少的部分,借助它我们可以做许多事情,比如问题排查、访问统计、监控告警等,需要的朋友可以参考下
@Log(logAfter = true, logBefore = true) public returntype methodName(params) 测试类com.liam.aop.aspect.test.AopLogAnnotationTest 测试输出 [log-aop]2014-12-18 14:31:43,506 INFO ...