DINGDANGMAOUP
DINGDANGMAOUP
Published on 2024-06-24 / 80 Visits
0
0

利用观察者模式记录日志

1.定义事件类型
public class LogEvent {

}
2.定义日志切面注解
import jakarta.interceptor.InterceptorBinding;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@InterceptorBinding
public @interface Loggable {


   String value() default "";
}
3.拦截器操作,并发布日志事件
import jakarta.enterprise.event.Event;
import jakarta.enterprise.inject.Any;
import jakarta.inject.Inject;
import jakarta.interceptor.AroundInvoke;
import jakarta.interceptor.Interceptor;
import jakarta.interceptor.InvocationContext;
import lombok.extern.slf4j.Slf4j;

@Interceptor
@Loggable
@Slf4j
public class LogInterceptor {

  @Inject
  @Any
  Event<LogEvent> event;


  /**
   *
   */
  @AroundInvoke
  public Object around(InvocationContext context) throws Exception {

    Loggable loggableAnnotation = context.getMethod().getAnnotation(Loggable.class);
    String logMessage = loggableAnnotation.value(); // Get the value of the parameter
    log.info("Entering method: {}", context.getMethod().getName());
    log.info("Log message: {}", logMessage);
    log.info("Exiting method: {}", context.getMethod().getName());
    Object result;
    long beginTime = System.currentTimeMillis();
    result = context.proceed();
    // 执行时长(毫秒)
    long time = System.currentTimeMillis() - beginTime;
    log.info("执行时长: {} 毫秒", time);
    event.fire(new LogEvent());
    return result;
  }


}

4.观察捕获事件
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;

@ApplicationScoped
public class EventSubscriber {

    public void onEvent(@Observes LogEvent event) {
        System.out.println("Received event: " + event);
    }
}


Comment