日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot/Cloud AOP 统一日志输出

發布時間:2024/9/27 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot/Cloud AOP 统一日志输出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


文章目錄

            • 1. 導入依賴
            • 2. aop攔截器
            • 3. logback配置
            • 4. 測試類
            • 5. 關鍵點
            • 6. 效果圖

1. 導入依賴
<!-- AOP --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><!-- 數據序列化--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency>
2. aop攔截器
package com.course.server.config;import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.support.spring.PropertyPreFilters; import com.course.server.util.UuidUtil; import org.aspectj.lang.JoinPoint; 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.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Field;@Aspect @Component public class LogAspect {private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);/** 定義一個切點 */@Pointcut("execution(public * com.course.*.controller..*Controller.*(..))")public void controllerPointcut() {}@Before("controllerPointcut()")public void doBefore(JoinPoint joinPoint) throws Throwable {// 日志編號MDC.put("UUID", UuidUtil.getShortUuid());// 開始打印請求日志ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();Signature signature = joinPoint.getSignature();String name = signature.getName();// 打印業務操作String nameCn = "";if (name.contains("list") || name.contains("query")) {nameCn = "查詢";} else if (name.contains("save")) {nameCn = "保存";} else if (name.contains("delete")) {nameCn = "刪除";} else {nameCn = "操作";}// 使用反射,獲取業務名稱Class clazz = signature.getDeclaringType();Field field;String businessName = "";try {field = clazz.getField("BUSINESS_NAME");if (!StringUtils.isEmpty(field)) {businessName = (String) field.get(clazz);}} catch (NoSuchFieldException e) {LOG.error("未獲取到業務名稱");} catch (SecurityException e) {LOG.error("獲取業務名稱失敗", e);}// 打印請求信息LOG.info("------------- 【{}】{}開始 -------------", businessName, nameCn);LOG.info("請求地址: {} {}", request.getRequestURL().toString(), request.getMethod());LOG.info("類名方法: {}.{}", signature.getDeclaringTypeName(), name);LOG.info("遠程地址: {}", request.getRemoteAddr());// 打印請求參數Object[] args = joinPoint.getArgs();Object[] arguments = new Object[args.length];for (int i = 0; i < args.length; i++) {if (args[i] instanceof ServletRequest|| args[i] instanceof ServletResponse|| args[i] instanceof MultipartFile) {continue;}arguments[i] = args[i];}// 排除字段,敏感字段或太長的字段不顯示String[] excludeProperties = {"shard"};PropertyPreFilters filters = new PropertyPreFilters();PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();excludefilter.addExcludes(excludeProperties);LOG.info("請求參數: {}", JSONObject.toJSONString(arguments, excludefilter)); // 為空的會不打印,但是像圖片等長字段也會打印}@Around("controllerPointcut()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {long startTime = System.currentTimeMillis();Object result = proceedingJoinPoint.proceed();// 排除字段,敏感字段或太長的字段不顯示String[] excludeProperties = {"password", "shard"};PropertyPreFilters filters = new PropertyPreFilters();PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();excludefilter.addExcludes(excludeProperties);LOG.info("返回結果: {}", JSONObject.toJSONString(result, excludefilter));LOG.info("------------- 結束 耗時:{} ms -------------", System.currentTimeMillis() - startTime);return result;}}
3. logback配置


logback.xml

<?xml version="1.0" encoding="UTF-8"?> <configuration><!-- 修改一下路徑--><property name="PATH" value="/log/imooc/course/business"></property><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder> <!-- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %blue(%-50logger{50}:%-4line) %green(%-8X{UUID}) %msg%n</Pattern>--><Pattern>%d{ss.SSS} %highlight(%-5level) %blue(%-30logger{30}:%-4line) %green(%-8X{UUID}) %msg%n</Pattern></encoder></appender><appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${PATH}/trace.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${PATH}/trace.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern></layout></appender><appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${PATH}/error.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${PATH}/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><layout><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-8X{UUID}) %msg%n</pattern></layout><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><root level="ERROR"><appender-ref ref="ERROR_FILE" /></root><root level="TRACE"><appender-ref ref="TRACE_FILE" /></root><root level="INFO"><appender-ref ref="STDOUT" /></root> </configuration>
4. 測試類
package com.course.business.controller.admin;import com.course.server.dto.ChapterDto; import com.course.server.dto.PageDto; import com.course.server.dto.ResponseDto; import com.course.server.service.ChapterService; import com.course.server.util.ValidatorUtil; import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;@RestController @RequestMapping("/admin/chapter") public class ChapterController {// 業務標識public static final String BUSINESS_NAME = "大章";@Resourceprivate ChapterService chapterService;//http://127.0.0.1:9002/business/admin/chapter/list@PostMapping("/list")public ResponseDto list(@RequestBody PageDto pageDto) {ResponseDto responseDto = new ResponseDto();chapterService.list(pageDto);responseDto.setContent(pageDto);return responseDto;}@PostMapping("/save")public ResponseDto save(@RequestBody ChapterDto chapterDto) {// 保存校驗ValidatorUtil.require(chapterDto.getName(), "名稱");ValidatorUtil.require(chapterDto.getCourseId(), "課程ID");ValidatorUtil.length(chapterDto.getCourseId(), "課程ID", 1, 8);ResponseDto responseDto = new ResponseDto();chapterService.save(chapterDto);responseDto.setContent(chapterDto);return responseDto;}@DeleteMapping("/delete/{id}")public ResponseDto delete(@PathVariable String id) {ResponseDto responseDto = new ResponseDto();chapterService.delete(id);return responseDto;} }
5. 關鍵點

LogAspect中日志key “UUID”要和logback.xml中的獲取的key UUID要一致,UUID生成規則自定義

6. 效果圖



總結

以上是生活随笔為你收集整理的SpringBoot/Cloud AOP 统一日志输出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人免费av在线 | 欧美激情亚洲色图 | 色www亚洲国产张柏芝 | 日韩社区 | 国产丰满果冻videossex | 91高潮大合集爽到抽搐 | 猛男被粗大男男1069 | 精品国产乱码久久久久久预案 | 一级黄色录像免费观看 | 91亚瑟视频| 久久久久国产精品区片区无码 | 成人精品999 | 宅宅少妇无码 | 日韩欧美成人一区 | www.成人免费 | 国产精品精品视频 | 久久成人毛片 | 91av中文字幕| 欧美精品卡一卡二 | aa一级黄色片 | 亚洲午夜久久久 | 欧美精品卡一卡二 | 久久99热人妻偷产国产 | 国产精品国产三级国产播12软件 | 欧美中文网 | 国产一卡二 | 69视频在线| 欧美一区二区三区日韩 | 久久狠狠高潮亚洲精品 | 欧美一区二区三区成人精品 | 黄色精品| 国产在线精 | 国产精品久久久久久福利 | 伊人亚洲精品 | 尤物精品| 天天摸夜夜操 | 99在线视频精品 | www.日韩视频| 国产精品播放 | 在线中文字幕视频 | www.国产.com | 欧美老女人xx | 亚洲欧美电影 | 日本网站免费观看 | 天堂二区 | 非洲黑人毛片 | 亚洲午夜国产 | 亚洲va欧美 | 在线观看免费黄视频 | 人妻洗澡被强公日日澡 | 久久久久久久久免费看无码 | avtt中文字幕 | 日本精品久久久久中文字幕 | 亚洲欧美日韩一区在线观看 | 国产女主播视频 | 国产精品成人aaaaa网站 | 天天视频天天爽 | 国产吧在线| 春色网站 | 伊人久久久久久久久久久久久 | 欧美日韩免费在线观看 | 成人午夜一区二区 | 久草老司机 | 日韩av网站在线播放 | 欧美在线视频网站 | 自拍偷拍99 | 果冻av在线| 国产精品久久久免费视频 | 销魂美女一区二区 | 亚洲六月婷婷 | 日韩欧美亚洲视频 | 9久久精品| 欧洲免费av | 免费在线观看成年人视频 | 一二三区av | 欧美精品一卡二卡 | 大尺度激情吻胸视频 | 青青免费视频 | 96久久久 | 干夜夜 | 三级av网址 | 亚洲热热 | 黄色三级在线 | 青青草视频观看 | 99re热这里只有精品视频 | 中文字幕无产乱码 | 欧美一级一区 | 黄视频网站在线观看 | 精品在线视频免费观看 | 久久精品国产精品 | av观看网站 | 日本亚洲欧洲色 | 精品视频无码一区二区三区 | 特黄视频免费看 | 亚洲a在线播放 | 精品一区二区三区久久 | 国产对白在线 | 中文字幕第10页 | 狠狠操一区二区 |