Написание точного выражения pointcut

Я использую Spring AOP для регистрации, где я хочу регистрировать ввод / вывод всех методов, присутствующих в пакете. Я написал следующий pointcut для целевого пакета.

@Pointcut("within(com.mypackage.model.*)")
public void allmethods(){};

Мой метод регистрации, как показано ниже.

@Before("allmethods()")
    public void LoggingAdviceBefore(JoinPoint joinPoint) 
    {
        StringBuffer logMessage = new StringBuffer();
        if(joinPoint != null && joinPoint.getTarget()!=null && joinPoint.getTarget().getClass()!=null)
        {
            logMessage.append(joinPoint.getTarget().getClass().getName());
            logMessage.append(".");
            logMessage.append(joinPoint.getSignature().getName());
            logMessage.append("(");
            // append args
            Object[] args = joinPoint.getArgs();
            for (int i = 0; i < args.length; i++) {
                logMessage.append(args[i]).append(",");
            }
            if (args.length > 0) {
                logMessage.deleteCharAt(logMessage.length() - 1);
            }

            logMessage.append(")");
            log.info(logMessage.toString());
        }

    }

Код работает нормально.

Моя проблема в том, что даже если я выполняю несколько простых операций, таких как заполнение списка массивов в моем коде, даже эта информация записывается в журнал. Я не хочу, чтобы такая информация регистрировалась.

Я хочу регистрировать входные данные только для методов, которые я написал в классах, присутствующих в целевом пакете, а не для кода, написанного внутри этих методов. Как мне этого добиться?

1 ответ

Решение

Вы можете использовать приведенный ниже код, который я написал несколько месяцев назад, чтобы понять реализацию платформы SNMP, он печатает ввод / вывод всех методов в пакете и подпакете, вы можете удалять ненужные классы и изменять в соответствии с вашими потребностями, если это необходимо.

@Aspect
public class Snmp4JProfiler {

    private static final Logger LOG = LoggerFactory.getLogger(Snmp4JProfiler.class);

    @Pointcut("execution (* org.snmp4j.Snmp.*(..))")
    public void allSnmpServices() {
    }

    @Pointcut("execution (* org.snmp4j.security.U*.*(..))")
    public void allUSMServices() {
    }

    @Around("allUSMServices() || allSnmpServices()")
    public Object executionTimeOfService(ProceedingJoinPoint pjp) throws Throwable {

        MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
        String className = pjp.getSignature().getDeclaringTypeName();
        final String methodName = methodSignature.getName();


        String methodArgs = "";
        for (Object obj : pjp.getArgs()) {

            if (obj == null) {
                methodArgs += "no args or null,";
            } else if (obj instanceof UsmTimeEntry) {
                UsmTimeEntry timeEntry = (UsmTimeEntry) obj;
                methodArgs += obj.toString() + "[" + timeEntry.getEngineBoots() + "," + timeEntry.getLatestReceivedTime() + ","
                        + timeEntry.getTimeDiff() + "," + timeEntry.getEngineID() + "]";
            } else if (obj instanceof Object[]) {
                methodArgs += obj.toString() + " " + Arrays.toString((Object[]) obj);
            } else {
                methodArgs += obj;
            }

        }

        LOG.info("Start of method#" + methodName + " #class#" + className + " #args#" + methodArgs);

        try {
            Object output = pjp.proceed();

            String rtValues = "";
            if (output == null) {
                rtValues += "no args or null,";
            } else if (output instanceof UsmTimeEntry) {
                UsmTimeEntry timeEntry = (UsmTimeEntry) output;
                rtValues += output.toString() + "[" + timeEntry.getEngineBoots() + "," + timeEntry.getLatestReceivedTime() + ","
                        + timeEntry.getTimeDiff() + "," + timeEntry.getEngineID() + "]";
            } else if (output instanceof Object[]) {
                rtValues += output.toString() + " " + Arrays.toString((Object[]) output);
            } else {
                rtValues += output;
            }

            LOG.info("End of method#" + methodName + " #class#" + className + " #return#" + rtValues);
            return output;
        } catch (Exception ex) {
            LOG.info("End of method#" + methodName + " #class#" + className + " #error#" + ex.getMessage());
            throw ex;
        }

    }

}
Другие вопросы по тегам