總結:aop 簡單運用,
比如 1.系統長時間運行你怎樣很容易找到 那些url 訪問最多(一般80%的請求都在常用鏈接上 2,8 原則) 那些耗時較長 具體優化重點(不需要亂優化一通)阿里數據源可以監控sql 耗時(這里我提下)
2. 如何快速點位 那台服務器出問題 快速找到(如果服務器多了 日志尋找也是 麻煩事情 統一(elk + beats 這種插件 組合 完全可以勝任 中小企業 當然中間還也可加消息系統擴展)使用
traceId 就可以很容易 只需要搜一下traceId 一樣的就是 同一個請求了 在定位服務 就行 當然開源產品 很多 zipkin 或者 SkyWalking 都很不多 我這里只是簡單實現
3. 還可以做 ip 黑名單 等
代碼如下 當然跟對細節 請看我代碼庫
public static final String TRACEID = "traceId";
/**
* 環繞通知,環繞增強,相當於MethodInterceptor
* 可以考慮 日志保存 在數據庫或者 其他容器 或者發給消息系統
* 1.系統分開部署 可以考慮 使用 traceId 一條(我這里簡單UUID 實現) 完整的結果 id 唯一 這里還可以帶上 用戶信息
* 可以考慮 成熟 開源 zipkin 或者 SkyWalking
* 2 .還可以監控 url 訪問次數 (這里我就不具體實現了)比如直接聚合 那些url 耗時較長
* 3. 還可以做 ip 黑名單 等
*/
@Around("webLog()")
public Object arround(ProceedingJoinPoint pjp) {
logger.info("方法環繞start.....");
Long start = System.currentTimeMillis();
try {
// 接收到請求,記錄請求內容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String traceId = UUID.randomUUID().toString();
//方便查找那台服務器報錯
InetAddress addr = InetAddress.getLocalHost();
String ip = addr.getHostAddress().toString();
String hostName = addr.getHostName().toString();
//錯誤結果處理可以后續請求拿到
request.setAttribute(TRACEID,traceId);
// 記錄下請求內容
logger.info("traceId : {}" , traceId);
logger.info("host : {} id {}" ,hostName,ip );
logger.info("contextPath : {}" , request.getContextPath());
logger.info("servletPath : {}" , request.getServletPath());
logger.info("url : {}" ,request.getRequestURL());
logger.info("uri : {}" ,request.getRequestURI());
logger.info("http_method : {}" , request.getMethod());
logger.info("IP:{}" , IpUtils.getIpAddr(request));
logger.info("class_method : {},{}" , pjp.getSignature().getDeclaringTypeName() ,pjp.getSignature().getName());
Object[] args = pjp.getArgs();
//序列化目的反正對象里面數組打印原始hash 值 看不清楚
logger.info("args : {},序列化數據:{}" , StringUtils.join(args,","),JSONUtil.parse(args));
Object o = pjp.proceed();
logger.info("方法環繞proceed,正常結果response :" + o);
return o;
} catch (Throwable e) {
//注意由於全局異常處理 這里需要拋出,不然全局異常會認為 方法沒有出錯
logger.info("異常通知.....");
throw new RuntimeException(e);
}finally {
Long end = System.currentTimeMillis();
logger.info("最后通知.....耗時:{}秒",(end-start)/1000);
}
}
https://www.cnblogs.com/qzwl/p/11792588.html