用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 ...
随机推荐
- angularjs ng-if 中的ng-model 值作用域问题
现象:最近做了一个需求,页面上使用了ng-if 条件做判断,导致通过使用 $scope 获取不到 ng-model 的值. 问题原因: ng-if这个指令单独开了一个作用域,它只可以继承,不可以进行往 ...
- spring自动注入是单例还是多例?单例如何注入多例?
单例和多例的区别 : 单例多例需要搞明白这些问题: 1. 什么是单例多例: 2. 如何产生单例多例: 3. 为什么要用单例多例 4. 什么时候用单例, ...
- PHP算法学习(3) 冒泡排序
2019年1月15日10:49:52 <?php /* * 冒泡排序 */ class BubbleSort { /* * 基础排序 */ public static function Basi ...
- Multi-Projector Based Display Code ---- Download
The code providing are for your reference. Please download the code according to your hareware confi ...
- Source Insight相关设置
#Source Insight中按快捷键在其他编辑器中打开当前文件 "D:\Program Files\Zend\ZendStudio-5.5.0\bin\ZDE.exe" %f ...
- AD模块电压采集电路
之前一直没搞明白模拟电压转换电路,不知道应该怎么计算转换电压,最近一个项目中用到几处模拟电压的采集,硬件是由其他同事设计的,转换公式也是他给的,记录一下: 24V电压采集: 公式:Vout = Vin ...
- socket通信的遇到的问题1
/*使用select对fd可读写,格式*/ while(ctrl){ //// FD_ZERO(&readSocketSet); FD_SET(readSocketFd,&readSo ...
- Django---cookie和session
Django的cookie和session 一.cookie 二.session 回到顶部 一.cookie 1.特点 1. cookie数据保存在客户端,以key-value存储 2. cookie ...
- 来吧学学.Net Core之项目文件简介及配置文件与IOC的使用
序言 在当前编程语言蓬勃发展与竞争的时期,对于我们.net从业者来说,.Net Core是风头正紧,势不可挡的.芸芸口水之中,不学习使用Core,你的圈内处境或许会渐渐的被边缘化.所以我们还是抽出一点 ...
- dependent object 和root object
dependent object 是root object 下面的字节点.每个节点被访问,都要通过 root object 进入.