作為運營除了處理系統生產問題,還要處理大量的用戶上報事件,這部分工作占用了大量的人力。所有考慮把一部分事件查詢處理做成一個自助平台,讓用戶自行核查處理。於是就有了用戶自助系統。考慮到如何計量這個工具平台具體的實現價值,需要做用戶操作統計才能給出可信服的數據。
以上就是本文的背景。自助系統的架構就是傳統的springmvc+spinrg+mybatis+oracle。想到日志記錄首先想到的就是AOP攔截處理。網上相關的技術貼很多。簡單的小項目遇到的問題一般度娘都能給解決了~\(≧▽≦)/~
自定義注解:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogAnnotation { String operateModelName() default ""; String operateFuncName() default ""; String operationType() default ""; String operateDescribe() default ""; }
在controller層引用注解
@Controller @RequestMapping(value="/kit") public class QueryClientInfoController { @Resource private IClientService clientService; private Logger logger = Logger.getLogger(this.getClass().getName()); @RequestMapping(value="/queryClientRegInfo") @LogAnnotation(operateModelName="用戶注冊模塊", operateFuncName="queryClientRegInfo", operationType="query", operateDescribe="查詢客戶注冊信息") public void queryClientRegInfo(HttpServletRequest request,HttpServletResponse response){ String client_idno = request.getParameter("idno"); Client client = clientService.queryClientRegInfo(client_idno);//調用service System.out.println("queryClientRegInfo:"+client.getName()); String jsonMap = JSON.toJSONString(client); response.setCharacterEncoding("UTF-8"); try { response.getWriter().write(jsonMap); response.getWriter().flush(); response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } }
查詢用戶注冊信息相關其他的service層等具體實現代碼就不貼出來了。
攔截器的實現
@Service(value="userLogService") public class UserLogServiceImpl implements IUserLogService { @Resource private UserLogDao userLogDao; @Override public void insert(UserLog record) { return userLogDao.insert(record); } @Override public void logBusiController(JoinPoint joinPoint) { Map<String, Object> map = new HashMap<String, Object>(); String targetName = joinPoint.getTarget().getClass().getName(); String methodName = joinPoint.getSignature().getName(); Object[] arguments = joinPoint.getArgs(); Class targetClass; try { targetClass = Class.forName(targetName); Method[] methods = targetClass.getMethods(); for (Method method : methods) { if(method.getName().equals(methodName)) { Class[] clazzs = method.getParameterTypes(); if(clazzs.length == arguments.length ) { if(method.getAnnotation(LogAnnotation.class)!= null){ map.put("operateModelName", method.getAnnotation(LogAnnotation.class).operateModelName()); map.put("operateFuncName", method.getAnnotation(LogAnnotation.class).operateFuncName()); map.put("operationType", method.getAnnotation(LogAnnotation.class).operationType()); map.put("operateDescribe", method.getAnnotation(LogAnnotation.class).operateDescribe()); }else break; } } } } catch (ClassNotFoundException e) { e.printStackTrace(); } HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpSession session =request.getSession(); User user = (User) session.getAttribute("currentUser"); System.out.println("currentUser:"+user.getName()+"\n targetName:"+targetName+"\n methodName:"+methodName +"\n operateModelName:"+map.get("operateModelName") +"\n operateFuncName:"+map.get("operateFuncName") +"\n operationType:"+map.get("operationType") +"\n operateDescribe:"+map.get("operateDescribe")); } }
接下來需要再配置文件中做攔截設置:
在spring-mvc.xml中增加
<bean id="LogService" class="com.bbc_kit.common.service.impl.UserLogServiceImpl"></bean> <aop:config> <aop:pointcut id="logBusiControllerPoint" expression="execution(* com.bbc_kit.business.controller..*.*(..))" /> <aop:aspect id="logService" ref="LogService"> <aop:after pointcut-ref="logBusiControllerPoint" method="logBusiController"/> </aop:aspect> </aop:config>
我的controller原來就是在mvc配置中做的掃描注入,service是在applicationContext.xml中做的掃描注入。所有要攔截service層的操作,可以把上面的配置微調下放置在applicationContext.xml中。
調用該.do后后台日志輸出
currentUser:renhuang
targetName:com.bbc_kit.business.controller.QueryClientInfoController
methodName:queryClientRegInfo
operateModelName:用戶注冊模塊
operateFuncName:queryClientRegInfo
operationType:query
operateDescribe:查詢客戶注冊信息