aop 简单运用,traceId 简单实现,访问日志拦截,ip黑名单

总结: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

 

posted @ 2019-06-06 13:01  川流不息&  阅读(1154)  评论(0编辑  收藏  举报