Spring?boot2.0?實現日志集成的方法(3)
前言
上一章Spring boot2.0 實現日志集成的方法(2)主要講解了將日志信息根據類別輸出到不同的文件中,實際開發(fā)中我們需要通過日志來監(jiān)控用戶的操作行為、請求的耗時情況,針對耗時久的請求進行性能分析,提升系統性能。
具體實現
采用的Spring Aop切面技術來實現控用戶的操作行為、請求的耗時情況。
定義日志注解
@Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogAnnotation { // 模塊 String model() default ""; // 功能 String func() default ""; //描述 String desc() default ""; }
定義日志切面
@Aspect @Component public class LogAspect { //請求監(jiān)控日志,輸出到不同日志文件 public static Log logger = LogManager.getLogger("request-access"); /** * 定義切面 */ @Pointcut("@annotation(com.test.aspect.LogAnnotation)") private void logPoinCut() { } /** * * @param joinPoint */ @Before(value = "logPoinCut()") public void doBefore(JoinPoint joinPoint) { String requestId =TraceIdUtil.getTraceId(); logger.info("Start invoke requestID:[{}]",requestId); } @Around(value = "logPoinCut()") public Object doAround(ProceedingJoinPoint jp) throws Throwable { String requestId =TraceIdUtil.getTraceId(); logger.info("Enter request start requestId :[{}]",requestId); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder .getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); MethodSignature signature = (MethodSignature) jp.getSignature(); Method method = signature.getMethod(); long startTime= System.currentTimeMillis(); OperationLog operationLog = new OperationLog(); LogAnnotation logAnnotation = method.getAnnotation(LogAnnotation.class); if (logAnnotation != null) { String model = logAnnotation.model(); String func = logAnnotation.func(); String desc = logAnnotation.desc(); operationLog.setModel(model); operationLog.setFunc(func); operationLog.setDesc(desc); } String className = jp.getTarget().getClass().getName(); String methodName = jp.getSignature().getName(); String uri = request.getRequestURI(); String ip = IpUtil.getIpAddr(request); operationLog.setClassName(className); operationLog.setMethodName(methodName); operationLog.setIp(ip); operationLog.setUri(uri); StringBuilder param = new StringBuilder(); Object[] args = jp.getArgs(); Object arg = null; for (int i = 0, j = args.length; i < j; i++) { arg = args[i]; param.append(" ") .append(arg == null ? null : args[i].toString()); if (i != (j - 1)) { param.append(",").append("\n"); } } operationLog.setParam(param.toString()); operationLog.setCreateDate(new Date()); long endTime=System.currentTimeMillis()-startTime; //可以通過配置設置異常調用請求時間 long costTime=3; operationLog.setCostTime(endTime); String logStr = JSON.toJSONString(operationLog); //將異常請求數據插入數據庫 if(endTime>costTime){ //saveOpetionLog(operationLog); } logger.info("invoke finish message:{}",logStr); Object obj = jp.proceed(); return obj; } /** * 方法之后調用 * @param joinPoint * @param returnValue 方法返回值 */ @AfterReturning(pointcut = "logPoinCut()") public void doAfterReturning(JoinPoint joinPoint) { String requestId=TraceIdUtil.getTraceId(); logger.info("End invoke request ID [{}]",requestId); } }
基本使用
@LogAnnotation(model="用戶管理",func="查詢用戶信息",desc="根據用戶名稱") @GetMapping("getUserByName") public Result getUserByName(@RequestParam String name) { logger.info("getUserByName paramter name:[{}]",name); return Result.success(userService.getUserByName(name)); }
輸出信息
{ "className": "com.test.controller.UserController", "costTime": 19, "createDate": "2022/03/11 15:20:30", "createUser": "xx", "ip": "172.18.188.111", "methodName": "getUserByName", "param": " zhangsan", "uri": "/user/getUserByName", "model":"用戶管理", "func":"查詢用戶信息", "desc":"根據用戶名稱", "version": 0 }
對于一些敏感的信息需要進行加密處理。針對異常的請求進行分析和性能優(yōu)化。
總結
上述日志信息雖然記錄的比較詳細,但是缺少了請求的來源,尤其是跨服務之間的調用,則無法進行追蹤。鏈路追蹤可以采用Spring Boot +logbck+MDC來實現。
到此這篇關于Spring boot2.0 實現日志集成的方法(3)的文章就介紹到這了,更多相關Spring boot 日志集成內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java線程之鎖對象Lock-同步問題更完美的處理方式代碼實例
這篇文章主要介紹了Java線程之鎖對象Lock-同步問題更完美的處理方式代碼實例,還是挺不錯的,這里分享給大家,需要的朋友可以參考。2017-11-11如何基于Springboot完成新增員工功能并設置全局異常處理器
最近工作中遇到了做一個管理員工信息的功能,下面這篇文章主要給大家介紹了關于如何基于Springboot完成新增員工功能并設置全局異常處理器的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-11-11在eclipse導入Java的jar包的方法JDBC(圖文說明)
這篇文章主要介紹了在eclipse導入Java 的jar包的方法 JDBC 圖文說明 ,需要的朋友可以參考下2015-09-09springboot多環(huán)境進行動態(tài)配置的方法
這篇文章主要介紹了springboot多環(huán)境下如何進行動態(tài)配置,本文主要分享了如何在springboot的項目中使用多環(huán)境配置,重點是”spring.profiles.active“屬性,需要的朋友可以參考下2022-06-06SQL Server 2000 Driver for JDBC Service Pack 3 安裝測試方法
這篇文章主要介紹了數據庫連接測試程序(SQL Server 2000 Driver for JDBC Service Pack 3 安裝測試),需要的朋友可以參考下2014-10-10