中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

封裝系統全局操作日志aop攔截且可打包給其他項目依賴

發布時間:2021-10-20 17:09:38 來源:億速云 閱讀:232 作者:柒染 欄目:大數據

封裝系統全局操作日志aop攔截且可打包給其他項目依賴,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

在開發過程中,為了更快地排錯,更好得了解接口訪問量,可以選擇用aop做全局的操作攔截,在項目不止一個的時候,我們可以選擇獨立出來,新項目可以很快的加上全局操作日志,具體代碼及數據庫表設計如下:

1.數據庫MySQL表結構設計,如下圖(可根據需要加減字段):
封裝系統全局操作日志aop攔截且可打包給其他項目依賴

2.可以根據表結構逆向生成相關實體類及Mapper,此步驟相對簡單(略)

3.增加全局日志切面類

**
 * @author songlonghui
 * @ClassName SystemLogAspect
 * @Description 日志切面記錄
 * @date 2019/7/24 16:38
 * @Version 1.0
 */
@Component
@Aspect
public class SystemLogAspect {

    private Logger logger = LoggerFactory.getLogger(SystemLogAspect.class);

    @Autowired
    private SystemLogDao systemLogDao;

    /*@Value("${LOG_POINT_URL}")
    private String logPointUrl;*/

    /** 以 controller 包下定義的所有請求為切入點 */
    @Pointcut("execution(public * com.machinsight.*.*.controller..*.*(..)) && !@annotation(com.machinsight.system_log.core.annotation.NoAspectAnnotation)")
    public void webLog() {
        //logger.warn("切點路徑---------->" + logPointUrl);
    }

    //private SystemLogWithBLOBs systemLogWithBLOBs;

    /**
     * 在切點之前織入
     * @param joinPoint
     * @throws Throwable
     */
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 開始打印請求日志
        //logger.info("=========================================== Start ===========================================");
    }

    /**
     * 在切點之后織入
     * @throws Throwable
     */
    @After("webLog()")
    public void doAfter() throws Throwable {
        logger.info("=========================================== End ===========================================");
        // 每個請求之間空一行
        logger.info("");
    }

    /**
     * 環繞
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 開始時間
        long startTime = System.currentTimeMillis();
        SystemLogWithBLOBs systemLogWithBLOBs = new SystemLogWithBLOBs();
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (null != attributes){
            HttpServletRequest request = attributes.getRequest();
            logger.error("當前線程號:--doAround--" + Thread.currentThread());
            String url = request.getRequestURL().toString();
            String description = proceedingJoinPoint.getSignature().getDeclaringTypeName();
            String requestArgs = FastJsonUtils.toJSONNoFeatures(proceedingJoinPoint.getArgs()).replaceAll("\\\\","");
            String ip = UuidUtil.getIpAddr(request);
            // 打印請求相關參數
            logger.info("========================================== Start ==========================================");
            // 打印請求 url
            logger.info("請求URL            : {}", url);
            // 打印 Http method
            logger.info("HTTP請求方法 Method    : {}", request.getMethod());
            // 打印調用 controller 的全路徑以及執行方法
            logger.info("Class--Controller 全路徑以及執行方法 Method   : {}.{}", description);
            // 打印請求的 IP
            logger.info("請求IP             : {}", ip);
            // 打印請求入參
            logger.info("請求參數Request Args   : {}", requestArgs);
            // 記錄日志入庫
            String value = request.getHeader("user-agent");  // 用戶代理信息
            //
            systemLogWithBLOBs.setCreateTime(new Date());  // 請求參數
            systemLogWithBLOBs.setMethod(url);  // 接口地址
            systemLogWithBLOBs.setRequestIp(ip);  //請求ip
            systemLogWithBLOBs.setRequestArgs(requestArgs);  // 請求參數
            systemLogWithBLOBs.setUserAgent(value); // 用戶代理信息
            systemLogWithBLOBs.setDescription(description);
        }
        Object result = null;
        try {
            result = proceedingJoinPoint.proceed();

            String responseArgs = FastJsonUtils.toJSONNoFeatures(result).replaceAll("\\\\","");

            long useTime = System.currentTimeMillis() - startTime;

            // 打印出參
            logger.info("具體返回參數 Response Args  : {}", responseArgs);
            // 執行耗時
            logger.info("整體執行耗時 Time-Consuming : {} ms", useTime);
            systemLogWithBLOBs.setResponseArgs(responseArgs);
            systemLogWithBLOBs.setTimeConsuming(Integer.valueOf(String.valueOf(useTime)));
        } catch (Throwable throwable) {
            // 設置異常信息
            systemLogWithBLOBs.setIsException(1);
            // 異常信息
            systemLogWithBLOBs.setExceptionDetail(throwable.getMessage());
            // 耗時
            long exceptionTime = System.currentTimeMillis() - startTime;
            systemLogWithBLOBs.setTimeConsuming(Integer.valueOf(String.valueOf(exceptionTime)));
            // 異常返回參數
            JsonResult jsonResult = new JsonResult();
            jsonResult.setMsg(CrmConstant.OPS_FAILED_MSG);
            jsonResult.setSuccess(CrmConstant.OPS_FAILED_CODE);
            jsonResult.setData(throwable.getMessage());
            String responseArgsForException = FastJsonUtils.toJSONNoFeatures(jsonResult);
            systemLogWithBLOBs.setResponseArgs(responseArgsForException);
            // 拋出異常
            throw new Throwable(throwable.getMessage());
        } finally {
            systemLogDao.insertSelective(systemLogWithBLOBs);
        }
        return result;
    }

4.可根據公司項目的整體包結構配置切點,還可以增加不需要攔截的配置,為了更靈活細化,這里增加了相應注解類,如下:

/**
 * 切面排除注解類
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NoAspectAnnotation {

}

5.只要在不需要的攔截的controller方法加上注解@NoAspectAnnotation即可,切點會自動排除:

/**
 * @author songlonghui
 * @ClassName CommonController
 * @Description TODO
 * @date 2019/8/23 16:09
 * @Version 1.0
 */
@Controller
@RequestMapping("common")
public class CommonController {

    @ResponseBody
    @RequestMapping("/test")
    @NoAspectAnnotation
    public String testLog(@RequestBody String inputJson) throws Exception{
        String msg = "操作成功";
        return msg;
    }

}

6.只要在別的項目中增加該項目依賴即可:

<!-- 全局日志切面 -->
<dependency>
   <groupId>com.machinsight</groupId>
   <artifactId>system_log</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <exclusions>
      <exclusion>
         <artifactId>*</artifactId>
         <groupId>*</groupId>
      </exclusion>
   </exclusions>
</dependency>

有需要整體項目源碼的朋友可以聯系我,現在還沒有想好源碼放在什么地方供別人下載!!
郵箱地址:lance911215@outlook.com

關于封裝系統全局操作日志aop攔截且可打包給其他項目依賴問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

aop
AI

安图县| 贵定县| 佛冈县| 宁明县| 汉川市| 广饶县| 西青区| 屏东县| 通许县| 五原县| 宁南县| 陈巴尔虎旗| 上高县| 乌什县| 勃利县| 博兴县| 巴青县| 江城| 聊城市| 合作市| 奉新县| 乐至县| 宁夏| 大方县| 南宫市| 分宜县| 利辛县| 淄博市| 沧州市| 通渭县| 石城县| 白山市| 江达县| 横峰县| 香港| 汉中市| 麻城市| 根河市| 绿春县| 和龙市| 苍溪县|