【问题标题】:Log method entries with Spring AOP [duplicate]使用 Spring AOP 记录方法条目 [重复]
【发布时间】:2023-03-13 00:03:01
【问题描述】:

任何人都知道如何记录方法条目(包括参数值)并在跟踪级别使用 Spring AOP 和 log4j 退出。它应该能够记录来自多个包的类。

【问题讨论】:

    标签: java spring logging


    【解决方案1】:

    您可以使用 Spring 框架的 PerformanceMonitorInterceptor 来记录方法条目。Here 是来自 DZone 的示例用法。

    【讨论】:

      【解决方案2】:

      你可以使用 @Around(..) 方面来达到这样的目的:

      @Component
      @Aspect
      @Order(value=2)
      public class LoggingAspect {
      
          @Around("execution(* com.blablabla.server..*.*(..))")
          public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable{
              final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass().getName());
              Object retVal = null;
      
              try {
                  StringBuffer startMessageStringBuffer = new StringBuffer();
      
                  startMessageStringBuffer.append("Start method ");
                  startMessageStringBuffer.append(joinPoint.getSignature().getName());
                  startMessageStringBuffer.append("(");
      
                  Object[] args = joinPoint.getArgs();
                  for (int i = 0; i < args.length; i++) {
                      startMessageStringBuffer.append(args[i]).append(",");
                  }
                  if (args.length > 0) {
                      startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length() - 1);
                  }
      
                  startMessageStringBuffer.append(")");
      
                  logger.trace(startMessageStringBuffer.toString());
      
                  StopWatch stopWatch = new StopWatch();
                  stopWatch.start();
      
                  retVal = joinPoint.proceed();
      
                  stopWatch.stop();
      
                  StringBuffer endMessageStringBuffer = new StringBuffer();
                  endMessageStringBuffer.append("Finish method ");
                  endMessageStringBuffer.append(joinPoint.getSignature().getName());
                  endMessageStringBuffer.append("(..); execution time: ");
                  endMessageStringBuffer.append(stopWatch.getTotalTimeMillis());
                  endMessageStringBuffer.append(" ms;");
      
                  logger.trace(endMessageStringBuffer.toString());
              } catch (Throwable ex) {
                  StringBuffer errorMessageStringBuffer = new StringBuffer();
      
                   // Create error message with exception  
                   logger.error(errorMessageStringBuffer.toString(), ex);    
                  throw ex;
              }
      
              return retVal;
          }
      }
      

      在这个例子中,方面记录了 com.blablabla.server 包下所有子包的所有方法调用。它还记录所有方法输入参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        • 1970-01-01
        • 2019-11-24
        • 2018-04-13
        • 1970-01-01
        相关资源
        最近更新 更多