先用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. java重构四则运算

    package 重构四则运算; import java.io.IOException; public class Test { public static void main(String[] arg ...

  2. 软件体系架构之ssh框架阅读笔记

    首先我们要了解一下什么是ssh框架? SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架. ssh框架系统从职责上分为四层:web层 业 ...

  3. asch相关的linux基础知识分享

    本文针对的人群:会用putty.SecureCRT.xhsell等工具ssh连接到自己的asch服务器上,但不怎么会执行命令的人.高手请绕路~ 本文主要围绕受托人搭建.维护涉及相关的内容进行Linux ...

  4. laravel整合vue 多入口解决

    2018年8月10日23:10:29 其实整合是挺简单,因为laravel本身就准备的挺好了 laravel 版本5.6   注意php cli是web是不一样的 这个需要设置环境变量 ,php需要7 ...

  5. iOS UIView 选择性倒角

    有些APP中会有卡券,卡券做成了选择性倒角,例如左上,右上倒角.非常美观.看一下iOS的实现: #import "Masonry.h" @interface WJWDaojiaoV ...

  6. hue,kylin,ambari

    apache-kylin https://ambari.apache.org/ https://www.jianshu.com/p/c49c61b654da docker pull sequencei ...

  7. Android创建列表并为列表添加数据

    在Android开发中经常会用到ListView,也就是列表,而列表的内容需要如何决定呢,很好的方法是使用各种adapter 首先来看看用entries添加列表内容 在布局文件中,创建一个ListVi ...

  8. Redis之基本使用

    基本介绍 Redis是一种key-value存储形式的非关系型数据库,也是一个强大的内存型存储系统,但是它比传统的Memcached 更灵活,支持更多的数据类型,同时也可以持久化. 支持的数据类型 先 ...

  9. 【托业】【怪兽】TEST04

    ❤ admit doing sth 承认做某事 ❤revelation n.揭露,揭示 ❤dazzling adj. 炫目的 ❤intentionally adv.刻意地 ❤metropolitan ...

  10. netty例子

    流式编程 客户端 这里MessageToByteEncoder继承于outchanel 服务端