切面实现对controller层进行统一日志记录

本文章项目开源地址

切面通用父类

这里实现抽象日志记录类,里面写好了对请求的信息(url、方法、请求头信息、参数)等信息,并对执行的controller的方法名、方法参数值进行记录,无论方法执行完成或者执行异常都会有相应的记录输出。也可以通用继承这个·抽象类·来实现自定义的日志记录。这里主要用了环绕通知及异常通知。里面使用了自定义注解,用于对当前执行的方法进行说明,方便日志观察。抽象类中的方法已经写好了切面能得到的所有信息,可以根据需要个性化定制。

package com.langangkj.home.cloud.common.aspect;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.langangkj.home.cloud.common.annotation.MethodLogDesc;
import com.langangkj.home.cloud.common.util.RequestUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.Map;

/**
 * @author ZhouChuGang
 * @version 1.0
 * @project ImageWeb
 * @date 2019/11/30 17:56
 * @Description 切面实现日志记录  记录每次请求的信息 抽象类 方便子类重写
 */
@Slf4j
public abstract class AbstractWebLogAspect {
   

    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 切入点
     * 子类可以重写
     */
    @Pointcut(
            "@annotation(org.springframework.web.bind.annotation.RequestMapping) || " +
                    "@annotation(org.springframework.web.bind.annotation.GetMapping)||" +
                    "@annotation(com.langangkj.home.cloud.common.annotation.MethodLogDesc) || " +
                    "@annotation(org.springframework.web.bind.annotation.PostMapping)"
    )
    protected void webLog() {
   

    }

    /**
     * 得到当前请求需要记录的信息
     *
     * @param request
     * @return
     */
    protected String getHttpServletRequestLogInfoStr(HttpServletRequest request) {
   
        // 记录下请求内容
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(String.format("URL:%s,    HTTP_METHOD:%s,    IP:%s \n", RequestUtil.getRequestUrl(), request.getMethod(), RequestUtil.getIpAddr(request)));
        Enumeration<String> headerNames = request.getHeaderNames();
        if (headerNames != null) {
   
            StringBuilder headStr = new StringBuilder();
            while (headerNames.hasMoreElements()) {
   
                String name = headerNames.nextElement();
                String header = request.getHeader(name);
                headStr.append(name).append(":").append(header).append("\n");
            }
            stringBuilder.append(String.format("header: %s", headStr.toString()));
        }
        Map<String, String[]> parameterMap = request.getParameterMap();
        if (parameterMap != null && !parameterMap.isEmpty())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值