2012-11-30 3 views
5

Java 용 웹 응용 프로그램을 작성하고 SLF4J를 사용하여 로깅합니다. 내가 로깅을 사용하는 모든 클래스의 아래 라인 작성의 피곤되고있어SLF4J, 매번 LoggerFactory.getLogger (MyClassName.class)를 쓰지 않으려면

:

private static final Logger logger = LoggerFactory.getLogger(ThisClassName.class); 

중복 코드를 방지하기 위해, 나는

interface Loggable { 
    Logger logger(); 
} 

같은 것을 생각하고, 각 클래스는 단지 수 이 인터페이스를 구현하면 AOP 같은 일부 마법이 LoggerFactory 부분을 삽입합니다.

누구든지 이것을 구현했거나이를 달성하는 방법을 알고 있습니까?

감사합니다.

답변

12

이클립스를 사용하고 있습니까? 그래서, 왜 그냥 그것을위한 '로거'와 같은 키워드를 다음과 같은 템플릿 코드 템플릿을 사용하는 경우 :

${:import(org.slf4j.LoggerFactory, org.slf4j.Logger)} 
private final static Logger LOGGER = LoggerFactory.getLogger(${enclosing_type}.class); 

그냥 "로거"를 입력합니다 이런 식으로, 변화 + 공간를 쳤고 너 끝났어.

+0

, 참조 작업을 수행합니다. AOP를 사소한 문제로만 고용하는 것은 미친 생각입니다. (특히 프로젝트가 아직 AOP 용으로 구성되지 않은 경우) –

0

AOP를 사용한 로깅은 Here에서 잘 설명됩니다. 메소드 실행의 세부 사항을 기록하는 메소드 안에 로거를 동적으로 삽입 할 수있는 방법이없는 것처럼 보입니다. 단위 테스트 케이스는이를 처리 할 수 ​​있습니다. 메서드 호출 로깅은 AOP에서 처리 할 수 ​​있습니다

1

CDI를 사용하고 있습니까? 그렇다면 제작자 방법을 만든 다음 @ 로거를 CDI 사용 가능 클래스에 주입합니다.

@Produces Logger createLogger(InjectionPoint injectionPoint) { 
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
} 

은 간단 정확히 http://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#d0e1662

관련 문제