1. 注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface LogAnno {
String description();
}
2.
package com.cignacmb.common.log.aspect;
import com.alibaba.fastjson.JSON;
import com.cignacmb.common.util.WebUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
@Slf4j
@Aspect
@Component
public class LogAnnotationAspect {
public static final String expression = "@annotation(com.cignacmb.common.log.anno.LogAnno) || @within(com.cignacmb.common.log.anno.LogAnno)";
@Pointcut(expression)
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
HttpServletRequest request = null;
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
request = attributes.getRequest();
} catch (Exception e) {
e.printStackTrace();
log.info("非HTTP请求,无需格式化日志");
String className = joinPoint.getSignature().getDeclaringTypeName();
String methodName = joinPoint.getSignature().getName();
Object[] methodArgs = joinPoint.getArgs();
log.info(" ------------------------ [{}] method start ------------------------", methodName);
log.info(" Method Args: {}", Arrays.toString(methodArgs));
log.info(" Class&Method: {}#{}", className, methodName);
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
log.info(" Method result: {}", JSON.toJSonString(result));
log.info(" Time Consuming: {} ms", endTime - startTime);
log.info(" ------------------------ [{}] method end ------------------------", methodName);
return result;
}
String deviceId = request.getHeader("X-Device-Id");
String version = request.getHeader("X-Request-Version");
String platform = request.getHeader("X-Request-Platform");
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
String methodName = methodSignature.getName();
String[] paramNames = methodSignature.getParameterNames();
String userId = request.getHeader("userId");
log.info("[ {} ] ------------------------ [{}] method start --------------------------", deviceId, methodName);
log.info("[ {} ] deviceId:[{}],version:[{}],platform:[{}],userId:[{}]", deviceId, deviceId, version, platform, userId);
log.info("[ {} ] Request Args: ParamName{} - ParamValue{}", deviceId, Arrays.toString(paramNames), Arrays.toString(joinPoint.getArgs()));
log.info("[ {} ] Request method: {}", deviceId, request.getMethod());
log.info("[ {} ] Request URL: {}", deviceId, request.getRequestURL().toString());
log.info("[ {} ] IP Address: {}", deviceId, WebUtil.getIpAddress(request));
log.info("[ {} ] User-Agent: {}", deviceId, request.getHeader("User-Agent"));
log.info("[ {} ] Class&Method: {}#{}", deviceId, joinPoint.getSignature().getDeclaringTypeName(), methodName);
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
log.info("[ {} ] Response result: {}", deviceId, JSON.toJSonString(result));
log.info("[ {} ] Time Consuming: {} ms", deviceId, endTime - startTime);
log.info("[ {} ] ------------------------ [{}] method end --------------------------", deviceId, methodName);
return result;
}
}
3.
package com.cignacmb.common.log.aspect;
import com.alibaba.fastjson.JSON;
import com.cignacmb.common.util.WebUtil;
import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
@Slf4j
@Component
public class LogMethodAspect implements MethodInterceptor {
@Value("${spring.application.name}")
private String applicationName;
public Object invoke(MethodInvocation invocation) throws Throwable {
HttpServletRequest request = null;
try {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
request = attributes.getRequest();
} catch (Exception e) {
e.printStackTrace();
log.info("非HTTP请求,无需格式化日志");
String className = invocation.getMethod().getDeclaringClass().getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
log.info(" ------------------------ [{}] method start ------------------------", methodName);
log.info(" Application Name: [{}]", applicationName);
log.info(" Method Args: {}", Arrays.toString(arguments));
log.info(" Class&Method: {}#{}", className, methodName);
long startTime = System.currentTimeMillis();
Object result = invocation.proceed();
long endTime = System.currentTimeMillis();
log.info(" Method result: {}", JSON.toJSonString(result));
log.info(" Time Consuming: {} ms", endTime - startTime);
log.info(" ------------------------ [{}] method end ------------------------", methodName);
return result;
}
String deviceId = request.getHeader("X-Device-Id");
String version = request.getHeader("X-Request-Version");
String platform = request.getHeader("X-Request-Platform");
String className = invocation.getMethod().getDeclaringClass().getName();
String methodName = invocation.getMethod().getName();
Object[] arguments = invocation.getArguments();
String userId = request.getHeader("userId");
log.info("[ {} ] ------------------------ [{}] method start ------------------------", deviceId, methodName);
log.info("[ {} ] Application Name: [{}]", deviceId, applicationName);
log.info("[ {} ] deviceId:[{}],version:[{}],platform:[{}],userId:[{}]", deviceId, deviceId, version, platform, userId);
log.info("[ {} ] Request Args: {}", deviceId, JSON.toJSonString(arguments));
log.info("[ {} ] Request method: {}", deviceId, request.getMethod());
log.info("[ {} ] Request URL: {}", deviceId, request.getRequestURL().toString());
log.info("[ {} ] IP Address: {}", deviceId, WebUtil.getIpAddress(request));
log.info("[ {} ] User-Agent: {}", deviceId, request.getHeader("User-Agent"));
log.info("[ {} ] Class&Method: {}#{}", deviceId, className, methodName);
long startTime = System.currentTimeMillis();
Object result = invocation.proceed();
long endTime = System.currentTimeMillis();
log.info("[ {} ] Response result: {}", deviceId, JSON.toJSonString(result));
log.info("[ {} ] Time Consuming: {} ms", deviceId, endTime - startTime);
log.info("[ {} ] ------------------------ [{}] method end ------------------------", deviceId, methodName);
return result;
}
}
4.
package com.cignacmb.common.log.config;
import com.cignacmb.common.log.aspect.LogAnnotationAspect;
import com.cignacmb.common.log.aspect.LogMethodAspect;
import org.springframework.aop.aspectj.AspectJexpressionPointcutAdvisor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnexpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LogAutoConfigure {
@Value("${log.aspect.paths}")
private String paths;
@Bean
public LogAnnotationAspect logAnnotationAspect() {
return new LogAnnotationAspect();
}
@Bean
@ConditionalOnProperty("log.aspect.paths")
@ConditionalOnexpression("!'${log.aspect.paths}'.equals('')")
public AspectJexpressionPointcutAdvisor configurableMethodAdvisor() {
// 配置类路径切面表达式
String pathexpression = buildAspectexpressionByPaths();
AspectJexpressionPointcutAdvisor advisor = new AspectJexpressionPointcutAdvisor();
String expressionBuilder = "(" + pathexpression + ")";
advisor.setexpression(expressionBuilder);
advisor.setAdvice(new LogMethodAspect());
return advisor;
}
private String buildAspectexpressionByPaths() {
if (paths == null || "".equals(paths)) {
return "";
}
String[] pathArray = paths.split(",");
StringBuilder pointCutBuilder = new StringBuilder();
for (String path : pathArray) {
pointCutBuilder.append(" || within(");
pointCutBuilder.append(path);
pointCutBuilder.append("..*)");
}
return pointCutBuilder.toString().replaceFirst(" \|\|", "");
}
}
log:
aspect:
paths: com.cignacmb.claims.controller



