先用AOP注解
1 package com.vlandc.oss.apigate.log.aspect;
2
3 import java.util.Map;
4 import java.util.Optional;
5
6 import javax.servlet.http.HttpServletRequest;
7
8 import org.aspectj.lang.JoinPoint;
9 import org.aspectj.lang.annotation.After;
10 import org.aspectj.lang.annotation.AfterReturning;
11 import org.aspectj.lang.annotation.AfterThrowing;
12 import org.aspectj.lang.annotation.Aspect;
13 import org.aspectj.lang.annotation.Before;
14 import org.aspectj.lang.annotation.Pointcut;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17 import org.springframework.beans.factory.annotation.Autowired;
18 import org.springframework.context.ApplicationContext;
19 import org.springframework.stereotype.Component;
20 import org.springframework.web.context.request.RequestContextHolder;
21 import org.springframework.web.context.request.ServletRequestAttributes;
22
23 import com.vlandc.oss.apigate.log.annotation.IUserLogAction;
24 import com.vlandc.oss.apigate.log.annotation.UserLogActionAnnotation;
25 import com.vlandc.oss.apigate.log.annotation.UserLogAnnotation;
26 import com.vlandc.oss.apigate.shiro.token.UserInfo;
27 import com.vlandc.oss.apigate.shiro.token.manager.TokenManager;
28 import com.vlandc.oss.common.JsonHelper;
29
30 @Aspect
31 @Component
32 public class UserLogAspect {
33
34 private final static Logger logger = LoggerFactory.getLogger(UserLogAspect.class);
35
36 ThreadLocal<UserLogBean> userLogObj = new ThreadLocal<>();
37
38 @Autowired
39 private TokenManager tokenManager;
40
41 @Autowired
42 private UserLogManager userLogManager;
43
44 @Autowired
45 private ApplicationContext context;
46
47 @Pointcut("@annotation(com.vlandc.oss.apigate.log.annotation.UserLogAnnotation)"
48 + "|| @annotation(com.vlandc.oss.apigate.log.annotation.UserLogActionAnnotation)")
49 public void userLog() {
50 }
51
52 protected UserInfo getCurrentUserInfo(String token) {
53 UserInfo userInfo = tokenManager.getUserInfo(token);
54 if (null != userInfo) {
55 return userInfo;
56 } else {
57 return null;
58 }
59 }
60
61 @Before(value = "userLog() && !@annotation(com.vlandc.oss.apigate.log.annotation.UserLogAnnotation)")
62 public void doBefore(JoinPoint joinPoint) throws Throwable {
63 parseCommonUserLogBean(joinPoint);
64 }
65
66 @Before(value = "userLog() && @annotation(ul)", argNames = "joinPoint,ul")
67 public void doBefore(JoinPoint joinPoint, UserLogAnnotation ul) throws Throwable {
68 parseCommonUserLogBean(joinPoint);
69
70 Object[] args = joinPoint.getArgs();
71 Optional.ofNullable(args).map(t -> {
72 try {
73 if (ul.loginIdOrder() > -1) {
74 userLogObj.get().setLoginId(String.valueOf(t[ul.loginIdOrder()]));
75 }
76 userLogObj.get().setTargetType(ul.targetType().name());
77 userLogObj.get().setTarget(String.valueOf(t[ul.targetOrder()]));
78 } catch (Exception e) {
79 logger.error("parse user log target error :" + JsonHelper.toJson(userLogObj.get()) + "; target annotation:" + ul.targetOrder() + "-" + ul.targetType().name());
80 }
81 return t;
82 });
83 }
84
85 private void parseCommonUserLogBean(JoinPoint joinPoint) {
86 UserLogBean userLogBean = new UserLogBean();
87 userLogObj.set(userLogBean);
88 userLogBean.setStartTime(System.currentTimeMillis() / 1000);
89 userLogBean.setAction(joinPoint.getSignature().getName());
90
91 Object[] args = joinPoint.getArgs();
92 Optional.ofNullable(args).map(t -> {
93 userLogBean.setParameter(JsonHelper.toJson(t));
94 return t;
95 });
96
97 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
98 HttpServletRequest httpRequest = attributes.getRequest();
99 UserInfo userInfo = getCurrentUserInfo(httpRequest.getHeader(TokenManager.TOKEN_KEY));
100 Optional.ofNullable(userInfo).map(t -> {
101 userLogBean.setLoginId(t.getLoginId());
102 userLogBean.setUserName(t.getName());
103 return t;
104 });
105 }
106
107 @AfterReturning(returning = "result", pointcut = "userLog() && !@annotation(com.vlandc.oss.apigate.log.annotation.UserLogActionAnnotation)")
108 public void doAfterReturning(Object result) throws Throwable {
109 parseCommonResult(result);
110 }
111
112 @AfterReturning(returning = "result", pointcut = "userLog() && @annotation(ula)", argNames = "result,ula")
113 public void doAfterReturning(Object result, UserLogActionAnnotation ula) throws Throwable {
114 try {
115 userLogObj.get().setTargetType(ula.targetType().name());
116
117 String userLogActionName = Optional.ofNullable(ula).map(t -> t.userLogAction()).orElse("");
118 if (context.containsBean(userLogActionName)) {
119 IUserLogAction userLogAction = (IUserLogAction) context.getBean(userLogActionName);
120 if(ula.defaultTargetKey().length() > 0) {
121 userLogAction.parseUserLogResult(ula.defaultTargetKey(), result, userLogObj.get());
122 }else {
123 userLogAction.parseUserLogResult(result, userLogObj.get());
124 }
125 }
126 } catch (Exception e) {
127 logger.error("parse target user log result error!", e);
128 }
129
130 parseCommonResult(result);
131 }
132
133 private void parseCommonResult(Object result) {
134 if (result instanceof String) {
135 userLogObj.get().setResult((String) result);
136
137 } else if (result instanceof Map) {
138 userLogObj.get().setResult(JsonHelper.toJson(result));
139 }
140 try {
141 logger.debug("the syslog object is " + JsonHelper.toJson(userLogObj.get()));
142 userLogManager.saveUserLog(userLogObj.get());
143 } catch (Exception e) {
144 logger.error("set sys log result error!", e);
145 }
146 }
147
148 @AfterThrowing(throwing = "ex", pointcut = "userLog()")
149 public void throwss(JoinPoint jp, Exception ex) {
150
151 }
152
153 @After("userLog()")
154 public void after(JoinPoint jp) {
155 userLogObj.get().setEndTime(System.currentTimeMillis() / 1000);
156 }
157 }
package com.vlandc.oss.apigate.log.aspect;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.vlandc.oss.apigate.db.DBService;
import com.vlandc.oss.apigate.db.DBServiceConst;
import com.vlandc.oss.apigate.log.annotation.OssUserLogRabbitMQClient;
@Component
public class UserLogManager {
private final static Logger logger = LoggerFactory.getLogger(UserLogManager.class);
public static final String USER_LOG_INDEX_PREFIX = "ossuserlog";
public static final String USER_LOG_INDEX_TYPE = "log";
public static String getCurrentlogIndex() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
return USER_LOG_INDEX_PREFIX + "-" + sdf.format(new Date());
}
@Autowired
private OssUserLogRabbitMQClient ossUserLogMQClient;
@Autowired
private DBService dbService;
public void saveUserLog(UserLogBean logContext){
try {
ossUserLogMQClient.send(logContext);
insertUserLog(logContext);
} catch (Exception e) {
logger.error("send user log to rabbitmq and db !" , e);
}
}
// 直接写入数据库
private void insertUserLog(UserLogBean logContext) {
HashMap<String, Object> parameters = new HashMap<String, Object>();
parameters.put("loginId", logContext.getLoginId());
parameters.put("response", logContext.getResult());
parameters.put("user", logContext.getUserName());
parameters.put("type", logContext.getTargetType());
parameters.put("subType", logContext.getAction());
parameters.put("ts", logContext.getStartTime());
parameters.put("endTs", logContext.getEndTime());
dbService.insert(DBServiceConst.INSERT_USER_LOG, parameters);
}
}