import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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.Map;
import java.util.StringJoiner;
/**
* Created by r.x on 2019/10/13.
*/
@Aspect
@Slf4j
@Component
public class LogAspect {
@Pointcut("execution(public * com.yrx.datasourcemanager.manager.api..*.*(..))")
private void pointcut() {
}
@Before("pointcut()")
private void beforeExeApi(JoinPoint joinPoint) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
// ip
String ip = getRemoteHost(request);
// 請(qǐng)求方式
String httpMethod = request.getMethod();
// url附帶的參數(shù)
String urlParam = getUrlParam(request);
// body 參數(shù)
String bodyParam = "";
if (httpMethod.equals("POST")) {
bodyParam = JSON.toJSONString(joinPoint.getArgs());
}
Signature signature = joinPoint.getSignature();
// 方法名
String methodName = signature.getName();
// 目標(biāo)類(lèi)
String targetClass = joinPoint.getTarget().getClass().getName();
log.info("before exe api: from:[{}], httpMethod:[{}], target:[{}], method:[{}], urlParam:[{}], bodyParam:[{}]",
ip, httpMethod, targetClass, methodName, urlParam, bodyParam);
}
private String getUrlParam(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
StringBuilder paramKv = new StringBuilder();
StringJoiner urlParam = new StringJoiner(", ");
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
for (String s : entry.getValue()) {
paramKv.append(entry.getKey()).append("=").append(s);
}
urlParam.add(paramKv.toString());
paramKv = new StringBuilder();
}
return urlParam.toString();
}
/**
* 獲取目標(biāo)主機(jī)的ip
*
* @param request
* @return
*/
private String getRemoteHost(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
}
}
用aop實(shí)現(xiàn)接口調(diào)用日志打印
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 前言 AOP 是 Aspect Oriented Program (面向切面)的編程的縮寫(xiě)。他是和面向?qū)ο缶幊滔鄬?duì)...
- 說(shuō)明 初次了解AOP就自己基于AspectJ實(shí)現(xiàn)了一個(gè)打印日志的功能,后來(lái)才發(fā)現(xiàn)Spring也有相關(guān)的接口,想用的...
- 在項(xiàng)目編寫(xiě)過(guò)程中,需要在必要的時(shí)候打印日志,而每個(gè)開(kāi)發(fā)人員對(duì)日志打印的格式又有所不一樣,這就導(dǎo)致項(xiàng)目中存在各種各樣...
- 標(biāo)準(zhǔn)庫(kù)fmt包中定義了 任何對(duì)象定義了String方法,即可以Stringer 類(lèi)型,fmt、log 進(jìn)行prin...
- 業(yè)務(wù)需求 一般項(xiàng)目進(jìn)入生產(chǎn)環(huán)境后,為了對(duì)系統(tǒng)進(jìn)行監(jiān)控,我們需要在業(yè)務(wù)邏輯里增加日志記錄功能。雖然這個(gè)需求很明確,但...