2009-11-13 5 views
3

현재 빌드 리드는 이론상으로 훌륭한 아이디어를 가지고 있습니다. 스프링 관리 빈을 사용하는 커스텀 Log4J appender를 생성하고 표준 로그 파일 이외의 다른 여러 소스에 오류를 기록하는 데 사용합니다. 그러나, 애플리케이션 컨텍스트 (코드가 잠시 후)로 시작될 때 싱글 톤을 생성하는 것 이외에 Log4J 애 퍼처에서 Spring 관리 빈을 검색하는 다른 옵션을 생각할 수 없다.Spring 관리 웹 애플리케이션의 Log4J Appender에서 Spring 관리 Bean을 검색 할 수있는 옵션은 무엇입니까?

public class SpringSingleton implements ApplicationContextAware { 
    private static ApplicationContext context; 
    public SpringSingleton() { 
     super(); 
    } 
    public static ApplicationContext getContext() { 
     return SpringSingleton.context; 
    } 
    public void setApplicationContext(ApplicationContext context) { 
     if(SpringSingleton.context != null) { 
      throw new IllegalStateException("Context is already set!"); 
     } 
     SpringSingleton.context = context; 
    } 
} 

이상적으로, 이러한 속성은 의존성 주입을 통해 봄에 바로 콩과 같이 설정 될 수있다 - 빈 참조 상관없이 많은 펜더가 초기화되는 방법을 변경하지 않습니다. 어떤 아이디어?

답변

6

log4j가 봄 전에 초기화되어야하므로 부스트 문제가 발생할 것입니다. custom configuration 또는 Log4j의 표준 초기화 프로그램을 사용하든 관계없이 응용 프로그램 컨텍스트가 시작되어야합니다.

이제는 이론적으로 사용자 정의 어 펜더를 "느슨하게"초기화 할 수 있습니다. 위에서 제안한 접근법을 사용하거나 어 펜더를 "세미"싱글 톤으로 만들 수 있습니다. 예를 들어 appender 클래스에 의해 채워지는 정적 인스턴스 필드가 있습니다. afterPropertiesSet() 메서드를 사용하면 appender 자체를 Spring 내에서 bean으로 만들 수는 있지만 다소 엉망이고 일관성이없는 것처럼 보입니다.

또 다른 방법은 Spring 컨텍스트가 초기화 된 후에 Log4j를 동적으로 재구성하는 것입니다. 예 : listener을 쓰고 ContextStartedEvent을 catch하고 컨텍스트에서 Appender 유형의 모든 bean을 확보하고 Log4j 구성에 추가하십시오. 이것은 또한 당신이 appender를 bean으로 만들 수는 있지만 singleton mess을 다소 피할 수있게합니다.

+0

는 우 ... 난 리스너 아이디어를 좋아한다. 나는 그것을 따라 가겠다. 나는 당신이 대리인을 위해 아주 아프지 않는 것처럼, 추가 답변을 기다릴 것이다. +1. – MetroidFan2002

+0

안녕하세요, Hey - Simpsons (http://www.imdb.com/title/tt1023430/quotes)에서 Rich Texan을 잘못 인용하십시오. "이 담당자를 불만스럽게 만들기 위해 열심히 노력했습니다."- – ChssPly76

+0

좋은 물건. AppApply 우리는 이미 추가 appenders 배열을 설정할 수있는 BeanFactoryPostProcessor 구현을 가지고 있습니다. 그래서 우리는 그것을 사용할 것입니다. 그러나 아무도이 질문에 대답하지 않았으므로 확실히 적합합니다. – MetroidFan2002