当前位置: 首页 > news >正文

潍坊 网站推广合肥百度seo代理

潍坊 网站推广,合肥百度seo代理,网站开发 图标,备案通过网站还是打不开为了实现一个高效且合理的日志记录方案#xff0c;我们需要在系统架构层面进行细致规划。在某些情况下#xff0c;一个前端页面可能会调用多个辅助接口来完成整个业务流程#xff0c;而并非所有这些接口的交互都需要被记录到日志中。为了避免不必要的日志开销#xff0c;并…为了实现一个高效且合理的日志记录方案我们需要在系统架构层面进行细致规划。在某些情况下一个前端页面可能会调用多个辅助接口来完成整个业务流程而并非所有这些接口的交互都需要被记录到日志中。为了避免不必要的日志开销并确保日志系统的可读性和有效性我们可以采用以下策略 日志记录策略概述 前端控制 前端在发起请求时可以通过HTTP头Header传递一个标志指示当前请求是否需要记录日志。例如可以使用一个自定义的Header如operation-log其值可以是true或false。 后端响应 后端服务接收到请求后首先检查该Header的存在及值。如果该Header存在且其值为true则后端将记录此次请求的相关信息反之则忽略日志记录。 下面贴出核心代码 注解 import java.lang.annotation.*;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface Loggable {// 接口信息String value() default ;// 是否记录响应结果默认为trueboolean logResponse() default true;// 模块String module() default ;// 类型 insert 新增 delete 删除 select 查看 update 修改String type() default ;}配置信息 import cn.com.nmd.base.constant.Constants; import cn.hutool.core.util.IdUtil; import org.slf4j.MDC; import org.springframework.web.filter.OncePerRequestFilter;import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class TraceIdFilter extends OncePerRequestFilter {Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {String traceId IdUtil.objectId();MDC.put(Constants.TRACE_ID, traceId);try {// 响应头中添加 traceId 参数方便排查问题response.setHeader(Constants.TRACE_ID, traceId);filterChain.doFilter(request, response);}finally {MDC.remove(Constants.TRACE_ID);}}}import cn.com.nmd.auth.log.mdc.TraceIdFilter; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered;Configuration ConditionalOnWebApplication public class TraceIdAutoConfiguration {Beanpublic FilterRegistrationBeanTraceIdFilter traceIdFilterRegistrationBean() {FilterRegistrationBeanTraceIdFilter registrationBean new FilterRegistrationBean(new TraceIdFilter());registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);return registrationBean;}}工具类 import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Objects;public class WebUtils extends org.springframework.web.util.WebUtils {/*** 获取 ServletRequestAttributes* return {ServletRequestAttributes}*/public static ServletRequestAttributes getServletRequestAttributes() {return (ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes());}/*** 获取 HttpServletRequest* return {HttpServletRequest}*/public static HttpServletRequest getRequest() {return getServletRequestAttributes().getRequest();}/*** 获取 HttpServletResponse* return {HttpServletResponse}*/public static HttpServletResponse getResponse() {return getServletRequestAttributes().getResponse();}}拦截器 import cn.com.nmd.auth.annotation.Loggable; import cn.com.nmd.auth.utils.SecurityUtils; import cn.com.nmd.auth.utils.WebUtils; import cn.com.nmd.base.constant.Constants; import cn.com.nmd.base.model.SysOperationLog; import cn.com.nmd.base.utils.IpUtils; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.URLUtil; import com.alibaba.fastjson.JSON; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.*;Aspect Component public class LogAspect {private static final Logger logger LoggerFactory.getLogger(LogAspect.class);private final ListClass? ignoredParamClasses ListUtil.toList(ServletRequest.class, ServletResponse.class,MultipartFile.class);// 定义切入点匹配带有 Loggable 注解的方法Pointcut(annotation(cn.com.nmd.auth.annotation.Loggable))public void loggableMethod() {}Around(loggableMethod())public Object aroundLog(ProceedingJoinPoint joinPoint) throws Throwable {// 获取 RequestHttpServletRequest request WebUtils.getRequest();String operateLog request.getHeader(operation-log);// 开始时间long startTime System.currentTimeMillis();SysOperationLog sysOperationLog null;boolean b false;if (true.equals(operateLog)) {// 获取目标方法MethodSignature signature (MethodSignature) joinPoint.getSignature();Method method signature.getMethod();Loggable loggable method.getAnnotation(Loggable.class);b loggable.logResponse();sysOperationLog this.buildLog(loggable, joinPoint);}Throwable throwable null;Object result null;try {result joinPoint.proceed();return result;} catch (Throwable e) {throwable e;throw e;} finally {if (true.equals(operateLog)) {// 操作日志记录处理this.handleLog(startTime, sysOperationLog, throwable, b, result);}}}private void handleLog(long startTime, SysOperationLog sysOperationLog, Throwable throwable, boolean b, Object result) {try {// 结束时间long executionTime System.currentTimeMillis() - startTime;// 执行时长sysOperationLog.setOperateTime(executionTime);// 执行状态String logStatus throwable null ? Constants.SUCCESS : Constants.FAIL;sysOperationLog.setStatus(logStatus);// 执行结果if (b) {Optional.ofNullable(result).ifPresent(x - sysOperationLog.setResult(JSON.toJSONString(x)));}else {sysOperationLog.setResult(({\code\: \200\,\message\: \\,\data\: \\}));}// 保存操作日志logger.info(保存的日志数据{}, JSON.toJSONString(sysOperationLog));} catch (Exception e) {logger.error(记录操作日志异常{}, JSON.toJSONString(sysOperationLog));}}private SysOperationLog buildLog(Loggable loggable, ProceedingJoinPoint joinPoint) {HttpServletRequest request WebUtils.getRequest();SysOperationLog operationLog new SysOperationLog();operationLog.setIp(IpUtils.getIpAddr(request));operationLog.setMethod(request.getMethod());operationLog.setUserAgent(request.getHeader(HttpHeaders.USER_AGENT));operationLog.setUri(URLUtil.getPath(request.getRequestURI()));operationLog.setType(loggable.type());operationLog.setModule(loggable.module());operationLog.setTraceId(MDC.get(Constants.TRACE_ID));operationLog.setCreateTime(new Date());operationLog.setParams(getParams(joinPoint));operationLog.setCreateUserId(SecurityUtils.getUserId());return operationLog;}/*** 获取方法参数** param joinPoint 切点* return 当前方法入参的Json Str*/public String getParams(ProceedingJoinPoint joinPoint) {// 获取方法签名Signature signature joinPoint.getSignature();String strClassName joinPoint.getTarget().getClass().getName();String strMethodName signature.getName();MethodSignature methodSignature (MethodSignature) signature;logger.debug([getParams]获取方法参数[类名]:{},[方法]:{}, strClassName, strMethodName);String[] parameterNames methodSignature.getParameterNames();Object[] args joinPoint.getArgs();Method method ((MethodSignature) signature).getMethod();if (ArrayUtil.isEmpty(parameterNames)) {return null;}MapString, Object paramsMap new HashMap();for (int i 0; i parameterNames.length; i) {Object arg args[i];if (arg null) {paramsMap.put(parameterNames[i], null);continue;}Class? argClass arg.getClass();// 忽略部分类型的参数记录for (Class? ignoredParamClass : ignoredParamClasses) {if (ignoredParamClass.isAssignableFrom(argClass)) {arg ignored param type: argClass;break;}}paramsMap.put(parameterNames[i], arg);}// 特别处理 RequestBody 参数for (int i 0; i parameterNames.length; i) {Object arg args[i];if (arg ! null method.getParameterAnnotations()[i].length 0) {RequestBody requestBodyAnnotation method.getParameterAnnotations()[i][0].annotationType().getAnnotation(RequestBody.class);if (requestBodyAnnotation ! null) {paramsMap.put(parameterNames[i], arg);}}}String params ;try {// 入参类中的属性可以通过注解进行数据落库脱敏以及忽略等操作params JSON.toJSONString(paramsMap);} catch (Exception e) {logger.error([getParams]获取方法参数异常[类名]:{},[方法]:{}, strClassName, strMethodName, e);}return params;} } 示例 Loggable(value 保存采集信息, type insert, module 业务管理-场站管理, logResponse true)
http://www.zqtcl.cn/news/100834/

相关文章:

  • 网站开发三剑客湖州市南浔区建设局网站
  • 江西专业的企业网站建设公司长沙做网站找哪家好
  • 国外互联网资讯网站南宁专业网站建设公司
  • 苏州新区做网站公司pc网站建设费用
  • 做影视网站需要多少钱2003网站建设
  • 河南智能网站建设哪家好重庆在建工程项目
  • 爱站网站长工具网站查看空间商
  • 网站营销活动页面制作wordpress 只显示一个主题
  • 电子网站建设怎么做秦皇岛网站制作公司
  • 网站建站模板样例平台推广怎么做
  • 网站建设首选亿企联盟做网站宣传有用吗
  • 网站建设公司行业苏州高端网站建设咨询
  • 电商平台网站开发过程江苏省建设科技发展中心网站简介
  • 空间租用 网站开发重庆手机网站推广资料
  • 新余 网站建设网站建设行业新闻
  • 做301网站打不开网上智慧团建网站
  • 四川省住房与城乡建设厅官方网站免费域名解析ip
  • 芜湖网站建设价格这么做网站原型图
  • 做传奇网站怎么弄的南京微网站开发
  • 网站建设基础教程人教版网站域名选择的原则
  • u盘做网站网站建设公司公司介绍
  • 嘉兴网站排名优化报windows wordpress 轻量级
  • html5网站开发方案海珠网站建设公
  • 津做网站建筑网课平台
  • 佛山制作手机网站汕头网站定制
  • 网站域名解释怎么做济南集团网站建设
  • 网站怎么做咨询网站开发商
  • 建立网站的第一步网站的管理系统
  • 安远做网站做宣传册网站
  • 网站建设概况君隆网站建设