@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Logger {
String name() default "";
String methods();
}
@Slf4j
@Aspect
@Component
public class ResponseLogAspect {
@Resource
private HttpServletRequest request;
@Pointcut( value = "@annotation(*.Logger)")
private void controllerPointcut() {
}
@Around(value = "controllerPointcut()")
public Object process(ProceedingJoinPoint point) throws Throwable {
String requestUri = Objects.requireNonNull(request).getRequestURI();
String requestMethod = request.getMethod();
StringBuilder beforeReqLog = new StringBuilder(300);
List<Object> beforeReqArgs = new ArrayList<>();
beforeReqLog.append("\n\n================ Request Start ================\n");
beforeReqLog.append("===> {}: {}");
beforeReqArgs.add(requestMethod);
beforeReqArgs.add(requestUri);
Map<String, Object> paraMap = getNameAndValue(point);
if (paraMap.isEmpty()) {
beforeReqLog.append("\n");
} else {
beforeReqLog.append("\n");
beforeReqLog.append("===>Parameters: {}\n");
beforeReqArgs.add(JSONObject.toJSON(paraMap));
}
Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String headerName = headers.nextElement();
String headerValue = request.getHeader(headerName);
beforeReqLog.append("===Headers=== {} : {}\n");
beforeReqArgs.add(headerName);
beforeReqArgs.add(headerValue);
}
beforeReqLog.append("================ Request End ================\n");
long startNs = System.nanoTime();
log.info(beforeReqLog.toString(), beforeReqArgs.toArray());
StringBuilder afterReqLog = new StringBuilder(200);
List<Object> afterReqArgs = new ArrayList<>();
afterReqLog.append("\n\n================ Response Start ===============\n");
try {
Object result = point.proceed();
return result;
} finally {
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
afterReqLog.append("<=== {}: {} ({} ms)\n");
afterReqArgs.add(requestMethod);
afterReqArgs.add(requestUri);
afterReqArgs.add(tookMs);
afterReqLog.append("================ Response End ===============\n");
log.info(afterReqLog.toString(), afterReqArgs.toArray());
}
}
private Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) {
Map<String, Object> param = new HashMap<>(8);
Object[] paramValues = joinPoint.getArgs();
String[] paramNames = ((CodeSignature) joinPoint.getSignature()).getParameterNames();
for (int i = 0; i < paramNames.length; i++) {
param.put(paramNames[i], paramValues[i]);
}
if (log.isDebugEnabled()) {
log.debug("param: {}", JSONObject.toJSONString(param));
}
return param;
}
public String format(Object result) {
try {
Object json = JSONObject.toJSON(result);
if (Objects.isNull(json)) return null;
ByteArrayInputStream in = new ByteArrayInputStream(json.toString().getBytes());
ByteArrayOutputStream out = new ByteArrayOutputStream();
char ch;
int read;
int space = 0;
while ((read = in.read()) > 0) {
ch = (char) read;
switch (ch) {
case '{': {
space = outputAndRightMove(space, ch, out);
break;
}
case '[': {
out.write(ch);
space += 2;
break;
}
case '}': {
space = outputAndLeftMove(space, ch, out);
break;
}
case ']': {
space = outputAndLeftMove(space, ch, out);
break;
}
case ',': {
out.write(ch);
outputNewline(out);
out.write(getBlankingStringBytes(space));
break;
}
default: {
out.write(ch);
break;
}
}
}
return out.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public int outputAndRightMove(int space, char ch, ByteArrayOutputStream out) throws IOException {
outputNewline(out);
out.write(getBlankingStringBytes(space));
out.write(ch);
outputNewline(out);
space += 2;
out.write(getBlankingStringBytes(space));
return space;
}
public int outputAndLeftMove(int space, char ch, ByteArrayOutputStream out) throws IOException {
outputNewline(out);
space -= 2;
out.write(getBlankingStringBytes(space));
out.write(ch);
return space;
}
public byte[] getBlankingStringBytes(int space) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < space; i++) {
sb.append(" ");
}
return sb.toString().getBytes();
}
public void outputNewline(ByteArrayOutputStream out) {
out.write('\n');
}
}
@Logger(modelName = "CompanyDescribeController",option = "find")
@RequestMapping(value = "find", method = RequestMethod.POST)
public BaseApiResponse<Obejct> find(
return null;
)