[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.나는 이것이 Spring AOP 문제는 아니지만 Log4j가 작동하는 방식이라고 생각한다. Javadoc for PatternLayout :
나는 이것이 Spring AOP 문제는 아니지만 Log4j가 작동하는 방식이라고 생각한다. Javadoc for PatternLayout :
따라서 필자의 권장 사항은 라인 번호가없는 패턴 레이아웃을 사용하고 Spring AOP의 라인 번호 결정 능력을 사용하는 것이다.
joinPoint.getSourceLocation().getLine()
from https://stackoverflow.com/questions/29443899/spring-aop-logging-line-number-incorrect by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Grails Spring Security LDAP 및 Spring Security Core Plugin 설치를 한 번만 설치하십시오. (0) | 2019.02.28 |
---|---|
[SPRING] 404 연관 매핑 오류 (0) | 2019.02.28 |
[SPRING] 스프링 메일을 통해 대량 전자 메일을 보내는 성능 향상 (0) | 2019.02.28 |
[SPRING] Bean의 속성이 util : list 객체에서 설정하지 않습니다. (0) | 2019.02.28 |
[SPRING] Grails와 CAS 기본 설정 (0) | 2019.02.28 |