先用AOP注解  
1 package com.vlandc.oss.apigate.log.aspect; import java.util.Map;
import java.util.Optional; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import com.vlandc.oss.apigate.log.annotation.IUserLogAction;
import com.vlandc.oss.apigate.log.annotation.UserLogActionAnnotation;
import com.vlandc.oss.apigate.log.annotation.UserLogAnnotation;
import com.vlandc.oss.apigate.shiro.token.UserInfo;
import com.vlandc.oss.apigate.shiro.token.manager.TokenManager;
import com.vlandc.oss.common.JsonHelper; @Aspect
@Component
public class UserLogAspect { private final static Logger logger = LoggerFactory.getLogger(UserLogAspect.class); ThreadLocal<UserLogBean> userLogObj = new ThreadLocal<>(); @Autowired
private TokenManager tokenManager; @Autowired
private UserLogManager userLogManager; @Autowired
private ApplicationContext context; @Pointcut("@annotation(com.vlandc.oss.apigate.log.annotation.UserLogAnnotation)"
+ "|| @annotation(com.vlandc.oss.apigate.log.annotation.UserLogActionAnnotation)")
public void userLog() {
} protected UserInfo getCurrentUserInfo(String token) {
UserInfo userInfo = tokenManager.getUserInfo(token);
if (null != userInfo) {
return userInfo;
} else {
return null;
}
} @Before(value = "userLog() && !@annotation(com.vlandc.oss.apigate.log.annotation.UserLogAnnotation)")
public void doBefore(JoinPoint joinPoint) throws Throwable {
parseCommonUserLogBean(joinPoint);
} @Before(value = "userLog() && @annotation(ul)", argNames = "joinPoint,ul")
public void doBefore(JoinPoint joinPoint, UserLogAnnotation ul) throws Throwable {
parseCommonUserLogBean(joinPoint); Object[] args = joinPoint.getArgs();
Optional.ofNullable(args).map(t -> {
try {
if (ul.loginIdOrder() > -1) {
userLogObj.get().setLoginId(String.valueOf(t[ul.loginIdOrder()]));
}
userLogObj.get().setTargetType(ul.targetType().name());
userLogObj.get().setTarget(String.valueOf(t[ul.targetOrder()]));
} catch (Exception e) {
logger.error("parse user log target error :" + JsonHelper.toJson(userLogObj.get()) + "; target annotation:" + ul.targetOrder() + "-" + ul.targetType().name());
}
return t;
});
} private void parseCommonUserLogBean(JoinPoint joinPoint) {
UserLogBean userLogBean = new UserLogBean();
userLogObj.set(userLogBean);
userLogBean.setStartTime(System.currentTimeMillis() / 1000);
userLogBean.setAction(joinPoint.getSignature().getName()); Object[] args = joinPoint.getArgs();
Optional.ofNullable(args).map(t -> {
userLogBean.setParameter(JsonHelper.toJson(t));
return t;
}); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest httpRequest = attributes.getRequest();
UserInfo userInfo = getCurrentUserInfo(httpRequest.getHeader(TokenManager.TOKEN_KEY));
Optional.ofNullable(userInfo).map(t -> {
userLogBean.setLoginId(t.getLoginId());
userLogBean.setUserName(t.getName());
return t;
});
} @AfterReturning(returning = "result", pointcut = "userLog() && !@annotation(com.vlandc.oss.apigate.log.annotation.UserLogActionAnnotation)")
public void doAfterReturning(Object result) throws Throwable {
parseCommonResult(result);
} @AfterReturning(returning = "result", pointcut = "userLog() && @annotation(ula)", argNames = "result,ula")
public void doAfterReturning(Object result, UserLogActionAnnotation ula) throws Throwable {
try {
userLogObj.get().setTargetType(ula.targetType().name()); String userLogActionName = Optional.ofNullable(ula).map(t -> t.userLogAction()).orElse("");
if (context.containsBean(userLogActionName)) {
IUserLogAction userLogAction = (IUserLogAction) context.getBean(userLogActionName);
if(ula.defaultTargetKey().length() > 0) {
userLogAction.parseUserLogResult(ula.defaultTargetKey(), result, userLogObj.get());
}else {
userLogAction.parseUserLogResult(result, userLogObj.get());
}
}
} catch (Exception e) {
logger.error("parse target user log result error!", e);
} parseCommonResult(result);
} private void parseCommonResult(Object result) {
if (result instanceof String) {
userLogObj.get().setResult((String) result); } else if (result instanceof Map) {
userLogObj.get().setResult(JsonHelper.toJson(result));
}
try {
logger.debug("the syslog object is " + JsonHelper.toJson(userLogObj.get()));
userLogManager.saveUserLog(userLogObj.get());
} catch (Exception e) {
logger.error("set sys log result error!", e);
}
} @AfterThrowing(throwing = "ex", pointcut = "userLog()")
public void throwss(JoinPoint jp, Exception ex) { } @After("userLog()")
public void after(JoinPoint jp) {
userLogObj.get().setEndTime(System.currentTimeMillis() / 1000);
}
}
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);
}
}

用AOP记录操作日志,并写进数据库。的更多相关文章

  1. 使用SpringBoot AOP 记录操作日志、异常日志

    平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...

  2. spring-boot-route(十七)使用aop记录操作日志

    在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...

  3. Spring aop 记录操作日志 Aspect

    前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...

  4. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  5. Spring aop 记录操作日志 Aspect 自定义注解

    时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...

  6. [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理

    设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...

  7. Spring Boot中使用AOP记录请求日志

    这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...

  8. Appfuse:记录操作日志

    appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...

  9. MVC 记录操作日志与过滤特殊字符

    最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...

随机推荐

  1. windows下安装 mysql 8.0 以上版本以及遇到的问题

    Windows 上安装 MySQL Windows 上安装 MySQL 相对来说会较为简单,地那就链接 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql ...

  2. 201771010126王燕《面向对象程序设计(Java)》第三周学习总结

    实验三 Java基本程序设计(2) 实验时间 2018-9-13 1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3) ...

  3. Unity进阶----AssetBundle_01(2018/10/30)

    AssetBundle作用和定义 1).AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载: 2).AssetBundle自身保存着互相的依赖关系 ...

  4. Web开发——jQuery进阶

    参考: 参考:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html 参考:Asynchronous J ...

  5. SSZipArchive解压乱码

    https://www.twblogs.net/a/5b7e01e22b7177683854b7b8/zh-cn 搜索   CFStringConvertEncodingToNSStringEncod ...

  6. 为多维数组添加一列以及reshape用法注意

    https://blog.csdn.net/orangefly0214/article/details/80934008参考这个了链接 下面是我自己用到的代码,亲测可用 # data = pd.rea ...

  7. python练习题-day20

    1.json.pickle.shelve三个区别是什么? 首先,这三个模块都是序列化工具. 1. json是所有语言的序列化工具,优点跨语言.体积小.只能序列化一些基本的数据类型.int\str\li ...

  8. what's the 灰盒测试

    what's the 灰盒测试 灰盒测试的概念:是一种综合测试的方法,他将白盒测试和黑盒测试结合在一起,构成一种无缝测试技术. 灰盒测试的思想:是基于程序运行时的外部表现又结合程序内部逻辑结构来设计测 ...

  9. ASM检查RAC是否成功

    [grid@asm ~]$ crsctl status resourceNAME=ora.DATA.dgTYPE=ora.diskgroup.typeTARGET=ONLINESTATE=ONLINE ...

  10. mac下mysql安装及配置启动

    ---恢复内容开始--- 原始链接:https://segmentfault.com/q/1010000000475470 按照如下方法成功安装并启动: mysql.server start//启动服 ...