복붙노트

[SPRING] 봄 Aop 로깅 줄 번호가 잘못되었습니다.

SPRING

봄 Aop 로깅 줄 번호가 잘못되었습니다.

내 응용 프로그램에 대한 로깅을 수행하기 위해 spring aop을 사용하고 있습니다. before와 afterthrowing advice가 구성되었지만 내가 본 라인 번호는 목표 클래스가 아니라 로깅에 사용되는 클래스의 라인 번호입니다. 이 문제를 어떻게 풀 수 있습니까? 아래는 나의 구성이다.

봄 xml :

<aop:aspectj-autoproxy proxy-target-class="false" />

로깅에 사용되는 클래스 :

package com.digilegal.services.ahc.logging;

import java.lang.reflect.Modifier;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

@Aspect
public class AHCLogging {

    @Before("execution(* com.digilegal.services..*.*(..))")
    public void logBefore(JoinPoint joinPoint) {

        Logger log = Logger.getLogger(joinPoint.getTarget().getClass());
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        if (!Modifier.isPrivate(signature.getModifiers())
                && !signature.getName().startsWith("get")
                && !signature.getName().startsWith("set")
                && !signature.getName().startsWith("is")) {
            log.trace("ENTER METHOD ::"
                    + signature.getReturnType().getSimpleName() + " "
                    + signature.getName() + "("
                    + paramterType(signature.getParameterTypes()) + ")");
        }

    }

    @After("execution(* com.digilegal.services..*.*(..))")
    public void logAfter(JoinPoint joinPoint) {
        Logger log = Logger.getLogger(joinPoint.getTarget().getClass());
        MethodSignature signature = (MethodSignature)     joinPoint.getSignature();

        if (!Modifier.isPrivate(signature.getModifiers())
                && !signature.getName().startsWith("get")
                && !signature.getName().startsWith("set")
                && !signature.getName().startsWith("is")) {
            log.trace("EXIT METHOD ::"
                    + signature.getReturnType().getSimpleName() + " "
                    + signature.getName() + "("
                    + paramterType(signature.getParameterTypes()) + ")");
        }
    }

    @AfterThrowing(pointcut = "execution(* com.digilegal.services..*.*        (..))",throwing= "error")
    public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
        Logger log = Logger.getLogger(joinPoint.getTarget().getClass());
        MethodSignature signature = (MethodSignature)     joinPoint.getSignature();

        if (!Modifier.isPrivate(signature.getModifiers())
                && !signature.getName().startsWith("get")
                && !signature.getName().startsWith("set")
                && !signature.getName().startsWith("is")) {
            log.error("EXCEPTION IN METHOD ::"
                    + signature.getReturnType().getSimpleName() + " "
                    + signature.getName() + "("
                    + paramterType(signature.getParameterTypes()) + ")");
            log.error("Exception",error);
        }
    }

    private String paramterType(Class<?>[] classes) {
        StringBuffer buffer = new StringBuffer();
        String returnValue = "";

        for (Class<?> string : classes) {
            buffer.append(Modifier.toString(string.getModifiers()));
            buffer.append(" ");
            buffer.append(string.getSimpleName());
            buffer.append(",");
        }

        returnValue = buffer.toString();

        if (returnValue.trim().length() > 0) {
            returnValue = returnValue.substring(0, returnValue.length() -         1);
        }

        return returnValue;
    }
}

나는 뭔가를 놓치고 있는가, 아니면 이렇게 생각하고 있는가?

감사

폐기 됨

해결법

  1. ==============================

    1.나는 이것이 Spring AOP 문제는 아니지만 Log4j가 작동하는 방식이라고 생각한다. Javadoc for PatternLayout :

    나는 이것이 Spring AOP 문제는 아니지만 Log4j가 작동하는 방식이라고 생각한다. Javadoc for PatternLayout :

    따라서 필자의 권장 사항은 라인 번호가없는 패턴 레이아웃을 사용하고 Spring AOP의 라인 번호 결정 능력을 사용하는 것이다.

    joinPoint.getSourceLocation().getLine()
    
  2. from https://stackoverflow.com/questions/29443899/spring-aop-logging-line-number-incorrect by cc-by-sa and MIT license