Spring?boot2.0?實現(xiàn)日志集成的方法(3)
前言
上一章Spring boot2.0 實現(xiàn)日志集成的方法(2)主要講解了將日志信息根據(jù)類別輸出到不同的文件中,實際開發(fā)中我們需要通過日志來監(jiān)控用戶的操作行為、請求的耗時情況,針對耗時久的請求進行性能分析,提升系統(tǒng)性能。
具體實現(xiàn)
采用的Spring Aop切面技術(shù)來實現(xiàn)控用戶的操作行為、請求的耗時情況。
定義日志注解
@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; //可以通過配置設(shè)置異常調(diào)用請求時間 long costTime=3; operationLog.setCostTime(endTime); String logStr = JSON.toJSONString(operationLog); //將異常請求數(shù)據(jù)插入數(shù)據(jù)庫 if(endTime>costTime){ //saveOpetionLog(operationLog); } logger.info("invoke finish message:{}",logStr); Object obj = jp.proceed(); return obj; } /** * 方法之后調(diào)用 * @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="根據(jù)用戶名稱") @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":"根據(jù)用戶名稱", "version": 0 }
對于一些敏感的信息需要進行加密處理。針對異常的請求進行分析和性能優(yōu)化。
總結(jié)
上述日志信息雖然記錄的比較詳細,但是缺少了請求的來源,尤其是跨服務(wù)之間的調(diào)用,則無法進行追蹤。鏈路追蹤可以采用Spring Boot +logbck+MDC來實現(xiàn)。
到此這篇關(guān)于Spring boot2.0 實現(xiàn)日志集成的方法(3)的文章就介紹到這了,更多相關(guān)Spring boot 日志集成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spark學(xué)習(xí)筆記(一)Spark初識【特性、組成、應(yīng)用】
這篇文章主要介紹了Spark學(xué)習(xí)筆記之Spark初識,簡單分析了spark四大特性、基本組成、應(yīng)用場景,需要的朋友可以參考下2020-02-02Java線程之鎖對象Lock-同步問題更完美的處理方式代碼實例
這篇文章主要介紹了Java線程之鎖對象Lock-同步問題更完美的處理方式代碼實例,還是挺不錯的,這里分享給大家,需要的朋友可以參考。2017-11-11SpringMvc接收參數(shù)方法總結(jié)(必看篇)
下面小編就為大家?guī)硪黄猄pringMvc接收參數(shù)方法總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器
最近工作中遇到了做一個管理員工信息的功能,下面這篇文章主要給大家介紹了關(guān)于如何基于Springboot完成新增員工功能并設(shè)置全局異常處理器的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-11-11在eclipse導(dǎo)入Java的jar包的方法JDBC(圖文說明)
這篇文章主要介紹了在eclipse導(dǎo)入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 安裝測試方法
這篇文章主要介紹了數(shù)據(jù)庫連接測試程序(SQL Server 2000 Driver for JDBC Service Pack 3 安裝測試),需要的朋友可以參考下2014-10-10