用AOP记录操作日志,并写进数据库。
先用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记录操作日志,并写进数据库。的更多相关文章
- 使用SpringBoot AOP 记录操作日志、异常日志
平时我们在做项目时经常需要对一些重要功能操作记录日志,方便以后跟踪是谁在操作此功能:我们在操作某些功能时也有可能会发生异常,但是每次发生异常要定位原因我们都要到服务器去查询日志才能找到,而且也不能对发 ...
- spring-boot-route(十七)使用aop记录操作日志
在上一章内容中--使用logback管理日志,我们详细讲述了如何将日志生成文件进行存储.但是在实际开发中,使用文件存储日志用来快速查询问题并不是最方便的,一个优秀系统除了日志文件还需要将操作日志进行持 ...
- Spring aop 记录操作日志 Aspect
前几天做系统日志记录的功能,一个操作调一次记录方法,每次还得去收集参数等等,太尼玛烦了.在程序员的世界里,当你的一个功能重复出现多次,就应该想想肯定有更简单的实现方法.于是果断搜索各种资料,终于搞定了 ...
- springmvc集成aop记录操作日志
首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...
- Spring aop 记录操作日志 Aspect 自定义注解
时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题 所需jar包 :spring4.3相关联以及a ...
- [编码实践]SpringBoot实战:利用Spring AOP实现操作日志审计管理
设计原则和思路: 元注解方式结合AOP,灵活记录操作日志 能够记录详细错误日志为运营以及审计提供支持 日志记录尽可能减少性能影响 操作描述参数支持动态获取,其他参数自动记录. 1.定义日志记录元注解, ...
- Spring Boot中使用AOP记录请求日志
这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...
- Appfuse:记录操作日志
appfuse的数据维护操作都发生在***form页面,与之对应的是***FormController,在Controller中处理数据的操作是onSubmit方法,既然所有的操作都通过onSubmi ...
- MVC 记录操作日志与过滤特殊字符
最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...
随机推荐
- 小甲鱼Python第二十二讲课后习题
笔记: 斐波那契数列的两种实现方式: 迭代的方式: 自己写的: def fab(n): n1 =1 n2 =1 n3 =1 if n < 1: return -1 if n ==1: ret ...
- 小甲鱼Python第二十一讲课后习题
测试题: 0. 递归在编程上的形式是如何表现的呢? 在编程上,递归表现为函数调用本身这么一个行为. 1. 递归必须满足哪两个基本条件? 一. 函数调用自身二. 设置了正 ...
- NOIP-铺地毯
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n张地毯,编号从1到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后 ...
- (51)Wangdao.com第七天_JavaScript 编写位置及输出语句
JavaScript 编写位置 编写在html内部标签的属性中 不推荐使用,因为结构和行为耦合,不便于维护 主要有 <button onclick="alert('点我干哈!');& ...
- SSIS获得Excel行号(转自http://blog.csdn.net/zplume/article/details/19113911)
问题描述: 首先个人并不推荐将Excel作为数据源,因为Excel单元格式会引起特别多的数据转换问题,例如:单元格里明明是2.89,但SSIS抽取到数据库里面之后却变成了2.88999999之类的数据 ...
- js_2_逻辑分支
- 20175320 2018-2019-2 《Java程序设计》第8周学习总结
20175320 2018-2019-2 <Java程序设计>第8周学习总结 教材学习内容总结 本周学习了教材的第十五章的内容,在这章中介绍了泛型和集合框架,着重讲了泛型类的概念,并介绍了 ...
- USACO1.4 1.5 搜索剪枝与数字 洛谷OJ P1214 P1215 P1217 P1218
USACO1.4 题解 Arithmetic Progressions 题意 让你求长为n的由小于2*m*m的双平方数组成的等差数列有几个 双平方数:形如 B=P*P+Q*Q,p,q>0的数 题 ...
- 关于Java8:StreamAPI的一点记录
关于 Stream ,Functional Interface 的一点记录 stream对于集合操作的便捷度提升: import java.util.ArrayList; import java.ut ...
- 一对一关联模型,HAS_ONE
class UserModel extends RelationModel{ protected $_link = array( 'Profile'=> HAS_ONE, //就这一行就行了 ) ...