pom.xml

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency> <dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>

SysLog.java

import java.lang.annotation.*;

/**
* 定义系统日志注解
* @author zhuzhe
* @date 2018/6/4 9:24
* @email 1529949535@qq.com
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}

SysLogAspect.java

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.cicso.jenkins.entity.TLoggerInfos;
import com.cicso.jenkins.service.TLoggerInfosService;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import static org.apache.commons.lang.CharEncoding.UTF_8; /**
* 系统日志切面
* @author zhuzhe
* @date 2018/6/4 9:27
* @email 1529949535@qq.com
*/
@Aspect // 使用@Aspect注解声明一个切面
@Component
@Slf4j
public class SysLogAspect { @Autowired
private TLoggerInfosService tLoggerInfosService; /**
* 这里我们使用注解的形式
* 当然,我们也可以通过切点表达式直接指定需要拦截的package,需要拦截的class 以及 method
* 切点表达式: execution(...)
*/
@Pointcut("@annotation(com.cicso.jenkins.config.SysLog)")
public void logPointCut() {} @Before("logPointCut()")
public void exBefore(JoinPoint pjp){
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
long startTime = System.currentTimeMillis();
request.setAttribute("startTime",startTime);
} /**
* 环绕通知 @Around , 当然也可以使用 @Before (前置通知) @After (后置通知)
* @param point
* @return
* @throws Throwable
*/
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
long endTime = System.currentTimeMillis();
// String url = request.getRequestURL().toString();
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
Object[] args = point.getArgs();
String params = "";
// result的值就是被拦截方法的返回值
Object result = point.proceed();
try {
long startTime = (long) request.getAttribute("startTime");
//获取请求参数集合并进行遍历拼接
if (args.length > 0) {
if ("POST".equals(method)) {
/* Object object = args[0];
params = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue);*/
Object[] arguments = new Object[args.length];
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceof MultipartFile) {
//ServletRequest不能序列化,从入参里排除,否则报异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)
//ServletResponse不能序列化 从入参里排除,否则报异常:java.lang.IllegalStateException: getOutputStream() has already been called for this response
continue;
}
arguments[i] = args[i];
}
if (arguments != null) {
try {
params = JSONObject.toJSONString(arguments);
} catch (Exception e) {
params = arguments.toString();
}
}
} else if ("GET".equals(method)) {
params = queryString;
}
params = URLDecoder.decode(params,UTF_8);
}
log.info("requestMethod:{},url:{},params:{},responseBody:{},elapsed:{}ms.", method , uri, params,
JSON.toJSONString(result,SerializerFeature.WriteMapNullValue),(endTime - startTime));
}catch (Exception e){
e.printStackTrace();
log.error("log error !!",e);
}
return result;
}
}

Response.java

package com.cicso.jenkins.utils;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Getter;
import lombok.Setter; import java.io.Serializable; /**
* 请求返回类
* Created by Tiger on 2018/10/9.
*/
@Getter
@Setter
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class Response<T> implements Serializable { private static final long serialVersionUID = -4505655308965878999L; //请求成功返回码为:0000
private static final String successCode = "200";
//返回数据
private T data;
//返回码
private String code;
//返回描述
private String msg; public Response(){
this.code = successCode;
this.msg = "success";
} public Response(String code,String msg){
this();
this.code = code;
this.msg = msg;
}
public Response(String code,String msg,T data){
this();
this.code = code;
this.msg = msg;
this.data = data;
}
public Response(T data){
this();
this.data = data;
}
}

UserController.java

package com.cicso.jenkins.controller;

import com.cicso.jenkins.config.SysLog;
import com.cicso.jenkins.entity.JenkinsCiLog;
import com.cicso.jenkins.entity.JenkinsMonitor;
import com.cicso.jenkins.entity.User;
import com.cicso.jenkins.service.JenkinsCiLogService;
import com.cicso.jenkins.service.JenkinsMonitorService;
import com.cicso.jenkins.service.UserService;
import com.cicso.jenkins.utils.Response;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; /**
* @Description
* @Author sgl
* @Date 2018-05-02 14:59
*/
@RestController
public class UserController {
@PostMapping("/postData")
@SysLog("postData")
public Response postData(HttpServletRequest httpRequest, @RequestBody JenkinsCiLog jenkinsCiLog) {
return new Response();
} @GetMapping("/users")
@SysLog("lists")
public Response lists(@RequestParam(defaultValue = "1") int pageNo, @RequestParam(defaultValue = "10") int pageSize) {
PageHelper.startPage(pageNo,pageSize);
PageInfo<User> pageInfo = new PageInfo<>(userService.getUsers());
return new Response(pageInfo);
} }

测试结果 console

-2019-07-26 09:44:14.407 - INFO 24236 --- [nio-8888-exec-1] com.cicso.jenkins.config.SysLogAspect    : requestMethod:GET,url:/jenkinsApi/users,params:pageNo=1&pageSize=10,responseBody:{"code":"200","data":{"endRow":5,"firstPage":1,"hasNextPage":false,"hasPreviousPage":false,"isFirstPage":true,"isLastPage":true,"lastPage":1,"list":[{"userAge":27,"userId":1,"userName":"张三"},{"userAge":30,"userId":2,"userName":"李四"},{"userAge":20,"userId":3,"userName":"王五"},{"userAge":null,"userId":123,"userName":"Tian"},{"userAge":null,"userId":234,"userName":"San"}],"navigateFirstPage":1,"navigateLastPage":1,"navigatePages":8,"navigatepageNums":[1],"nextPage":0,"pageNum":1,"pageSize":10,"pages":1,"prePage":0,"size":5,"startRow":1,"total":5},"msg":"success"},elapsed:0ms.
-3FCFE828206F320092C49A320E3C131A
2019-07-26 09:44:18.323 - INFO 24236 --- [nio-8888-exec-2] com.cicso.jenkins.config.SysLogAspect : requestMethod:POST,url:/jenkinsApi/postData,params:[null,{"actiontype":"string","buildTag":"string","buildUrl":"string","data":"string","id":0,"phasetype":"string","requestTime":1564102810254,"startTime":1564102810254}],responseBody:{"code":"200","data":null,"msg":"success"},elapsed:0ms.

Springboot AOP写操作日志 GET POST的更多相关文章

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

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

  2. Spring Boot AOP 简易操作日志管理

    AOP (Aspect Oriented Programming) 面向切面编程. 业务有核心业务和边缘业务. 比如用户管理,菜单管理,权限管理,这些都属于核心业务. 比如日志管理,操作记录管理,这些 ...

  3. SpringBoot AOP处理请求日志处理打印

    SpringBoot AOP处理请求日志处理打印 @Slf4j @Aspect @Configuration public class RequestAopConfig { @Autowired pr ...

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

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

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

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

  6. Spring aop 记录操作日志 Aspect

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

  7. 新来的老大,剑走偏锋,干掉AOP做操作日志,实现后我们都惊呆了

    前言 用户在操作我们系统的过程中,针对一些重要的业务数据进行增删改查的时候,我们希望记录一下用户的操作行为,以便发生问题时能及时的找到依据,这种日志就是业务系统的操作日志. 本篇我们来探讨下常见操作日 ...

  8. 用AOP记录操作日志,并写进数据库。

    先用AOP注解 1 package com.vlandc.oss.apigate.log.aspect; import java.util.Map; import java.util.Optional ...

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

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

随机推荐

  1. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

  2. [转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习) https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 ...

  3. ARTS第九周打卡

    Algorithm : 做一个 leetcode 的算法题 /* 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. ...

  4. 剑指offer57:二叉树的下一个结点

    1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a ...

  5. odoo——日历的一对多与多对一

    # model文件 # -*- coding: utf-8 -*- from odoo import api, fields, models class TodoTestYear(models.Mod ...

  6. Unity性能优化-遮挡剔除

    1. Occlusion Culling-遮挡剔除的含义:没有在Camear视野范围内的游戏物体不进行渲染Render(默认情况下,Unity是会渲染所有GameObject,无论Camear是否看得 ...

  7. office2019激活码 最新各个版本激活码

    office2019专业版激活码 激活秘钥 一.office2019激活6月更新 [Key]:F4QWT-NMMKH-XPTV9-W9HFB-B4JCQ [剩余次数:900000+] office20 ...

  8. JS基础_构造函数修改

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

  9. 4、java基础:JDK8接口新特性以及接口和抽象类区别

    在jdk8之前,interface之中可以定义变量和方法,变量必须是public.static.final的,方法必须是public.abstract的.由于这些修饰符都是默认的,所以在JDK8之前, ...

  10. ES6 Proise 简单理解

    Promise 这是ES6中增加的一个处理异步的对象. 传统变成写异步函数的时候,经常会遇到回调套回调: Promise 是异步编程的一种解决方案,比传统的解决方案 -----回调函数和事件----- ...