1. 程式人生 > >用AOP記錄操作日誌,並寫進資料庫。

用AOP記錄操作日誌,並寫進資料庫。

先用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() && [email protected](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() && [email protected](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);
    }
}