先用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. 简单的3d变换

    <!DOCTYPE html><html> <head>  <meta charset="UTF-8">  <title> ...

  2. bootstrap_开始

    bootstrap 一个移动设备优先 UI 库,底层是用 less 写的,依赖于 jQuery. 面试点: bootstrap 的所有盒子都是怪异盒子模型(box-sizing: border-box ...

  3. Java课程寒假之《人月神话》有感之二

    一.外科手术队伍 即建立一个合理的团队,按照书上的说法就是,在开发一个大的系统的时候,原本精英的团队就可能无法在较短的时间内完成一个大型的程序,在这样的条件下,必须扩大团队的规模,即使这个精英程序员的 ...

  4. tp3.2 模块单独配置数据库

    一 $User = M('test','tp_','mysql://root:123456@localhost/new_lezhu#utf8'); 1.test       -->表名 2.tp ...

  5. css学习_css BFC特性(块级格式化上下文)

    块级元素会有bfc条件------可以触发bfc--------利用bfc的特性来解决一些问题 1.什么是BFC? 就是一个封闭独立的渲染的区域 2.什么元素会有BFC的条件? ---块级元素会有,行 ...

  6. c#4.8-4.11学习总结

    4.8讲的是static 关键字.它用于修饰类 ,字段 ,属性,方法和构造方法等.被它修饰的类称为静态类,成员称为静态成员.  先说静态字段,它是普通字段前面加个static,它不属于任何对象,只属于 ...

  7. CSIS 1119B/C Introduction to Data Structures and Algorithms

    CSIS 1119B/C Introduction to Data Structures and Algorithms Programming Assignment TwoDue Date: 18 A ...

  8. error lnk1158 无法运行rc.exe

    找到C:\Program Files (x86)\Windows Kits\8.0\bin\在运行一下rc.exe和rcdll.dll拷贝到D:\Soft\VS2015\VC\bin目录下.

  9. springBoot生成日志文件

    一.安装lombok 说明: 安装bomlok后model可以不用写get.set方法,slf4j日志直接使用log打印 1. Maven Repository中下载lombok.jar 2. 将lo ...

  10. Byword for Mac(Markdown编辑器)中文版

    还在找Markdown编辑器吗?那不妨试试Byword for Mac吧!这是一款轻量级的富文本编辑器,byword mac版提供了完整的Markdown支持,包含脚注.表格.交叉引用等功能,Bywo ...