在单个新项目中如果我们必须纪录实际操作日志一般会根据以下方式完成:
实际完成能够参照以下的文章内容连接:
http://javadaily.cn/articles/2020/05/13/1589330750429.html
可是在分布式架构中大家不太可能每一个服务项目都写一个自定义注解,再写一个AOP,这很显著违背了 Don’t repeat yourself 精神实质。因此 此刻大家一般都是会创建一个公共性的部件,在公共性部件中进行日志的搜集,后端开发服务项目只必须引进这一公共性的部件就可以。
这就是今日文章内容的內容,单独的业务流程日志搜集部件。
SpringBoot Starter
要完成以上的作用大家必须依靠SringBoot Starter来完成,SpringBoot 的一大优点便是Starter,根据Starter我们可以封裝公共性的领域模型及其主要参数的复位,假如你一直在开展微服务架构开发设计,Starter的撰写是一定要把握的。
这儿大家简易提一下SpringBoot Starter完成自动化技术配备的步骤
全过程以下:
最先我们在新项目中创建一个starter的module,如cloud-component-logging-starter
撰写配备类SysLogAutoConfigure
- @Configuration
- public class SysLogAutoConfigure {
- @Bean
- public SysLogAspect controllerLogAspect(){
- return new SysLogAspect();
- }
- }
在SysLogAutoConfigure中大家引入了一个日志横切面SysLogAspect,因为日志搜集专用工具不用附加配备特性,因此 大家也就不用界定特性配备类了。
自定日志注释 SysLog
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface SysLog {
- /**
- * 日志內容
- * @return {String}
- */
- String value();
- }
界定日志横切面 SysLogAspect
- @Aspect
- public class SysLogAspect {
- private final Logger log = LoggerFactory.getLogger(this.getClass());
- @Pointcut("@annotation(com.javadaily.component.logging.annotation.SysLog)")
- public void logPointCut() {
- }
- @Around("logPointCut()")
- public Object around(ProceedingJoinPoint pjp) throws Throwable {
- MethodSignature signature = (MethodSignature) pjp.getSignature();
- Method method = signature.getMethod();
- //类名
- String className = pjp.getTarget().getClass().getName();
- //方式名
- String methodName = signature.getName();
- SysLog syslog = method.getAnnotation(SysLog.class);
- //实际操作
- String operator =syslog.value();
- long beginTime = System.currentTimeMillis();
- Object returnValue = null;
- Exception ex = null;
- try {
- returnValue = pjp.proceed();
- return returnValue;
- } catch (Exception e) {
- ex = e;
- throw e;
- } finally {
- long cost = System.currentTimeMillis() - beginTime;
- if (ex != null) {
- log.error("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][产生出现异常]",
- className, methodName, operator, pjp.getArgs(), ex);
- } else {
- log.info("[class: {}][method: {}][operator: {}][cost: {}ms][args: {}][return: {}]",
- className, methodName, operator, cost, pjp.getArgs(), returnValue);
- }
- }
- }
- }
上边的横切面表明,针对应用了@SysLog注释的方式全自动开展日志搜集,将日志键入到日志文档。
在resource/META-INF文件目录下创建spring.factories文档,载入配备类SysLogAutoConfigure
- org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
- com.javadaily.component.logging.configure.SysLogAutoConfigure
在微服务架构中引进日志部件
- <dependency>
- <groupId>com.jianzh5.cloud</groupId>
- <artifactId>cloud-component-logging-starter</artifactId>
- <version>1.0.0</version>
- </dependency>
在必须开展日志搜集的方式上加上@SysLog注释
- @SysLog("搜索客户")
- public ResultData<AccountDTO> getByCode(@PathVariable(value = "accountCode") String accountCode){
- log.warn("get account detail,accountCode is :{}",accountCode);
- SecurityUser securityUser = SecurityUtils.getUser();
- log.info(securityUser);
- AccountDTO accountDTO = accountService.selectByCode(accountCode);
- return ResultData.success(accountDTO);
- }
根据上边7步大家完成了日志搜集部件的自定Starter撰写,这儿很有可能有的老同学聚会问,在 SysLogAutoConfigure类中并不是拥有 @Configuration和 @Bean注释,这两个注释并不是能够全自动载入界定的Bean到IOC器皿吗?为何还必须根据在spring.factories文档中导进 SysLogAutoConfigure呢?
这是由于springboot新项目默认设置总是扫描仪本新项目下的带@Configuration注释的类,假如自定starter,没有本工程项目中,是没法载入的,因此 要配备META-INF/spring.factories环境变量,根据spring.factories来装车配备类。
【责编:武晓燕 TEL:(010)68476606】