2011-11-22 3 views
0

소개 : 나는 proj-a, proj-b, proj-c 등 여러 프로젝트가 있습니다.이 프로젝트는 종속성에서 pom.xml을 통해 연결됩니다.log4j 로깅이 교차 프로젝트 응용 프로그램에 표시되지 않습니까?

내 문제는 다음과 같습니다. proj-a는 모든 프로젝트에 공통적 인 모든 주요 프레임 워크 프로젝트입니다. 따라서 내 정적 로그 처리기는 해당 프로젝트에 포함되어 있습니다. 그것은 이제 proj-b에 의해 참조되며 로그 처리기에 액세스 할 수 있지만 로그 할 때마다 지정된 파일이나 콘솔에 기록하지 않습니다. proj-a에서 junit 테스트를 작성하고 로그 핸들러를 테스트 했으므로 구성이 올바른지 알고 출력에 필요한 결과를 출력하고 파일 및 콘솔 디스플레이의 로그를 출력합니다.

PROJ-B 샘플 코드 다음과 같이

public class TestServicePublisher { 

    public static void main(final String[] args) { 
     // System.out.println("Test Service started."); 
     // Endpoint.publish("http://localhost:8080/cas-service", new TestService()); 
     LogHandler.logDebug(TestServicePublisher.class, "main", "Starting Login Service"); 
     Endpoint.publish("http://localhost:8080/cas-service/login", new LoginService()); 
    } 

} 

Proj를-A의 logHandler의 샘플이다 :

public static String logDebug(Class clazz, String methodName, 
     Integer messageCode, List<String> messageAttributes) { 
    List<String> classMethodAttributes = createClassMethodAttributes(clazz, 
      methodName); 
    String message = retrieveMessage(messageCode, messageAttributes, 
      classMethodAttributes); 
    Logger logger = Logger.getLogger(clazz); 
    logger.debug(message); 
    return message; 
} 

PROJ-A는 물론 Log4J JAR 파일이 포함 log4j.xml.

답변

0

나는 이제 내 고민에 대한 해결책을 가지고있다. 모든 프로젝트에서 가지고있는 모든 POM을 다시 검사하고 projectC에 log4j 의존성의 또 다른 인스턴스를 찾았습니다.

분명히 이것은 slf4j와 slf4j-jdk와 함께 나온 것이므로 slf4j 설명서의 예제 here과 같은 정보 수준의 로그를 볼 수 있습니다. POM에서 이러한 종속성을 제거한 후에는 아무런 문제없이 관련 프로젝트에서 주 방법을 실행할 수있었습니다.

또한 다른 프로젝트에서 의존하지 않았기 때문에 junits 나 main 메소드를 projectA에서 실행했을 때 디버깅 정보를 얻었습니다. 이는 slf4j 및 slf4j-jdk가 포함되지 않았 음을 의미합니다.

0

파일을 구성 파일에 설정하는 대신 런타임에 설정하지 않는 이유는 무엇입니까?

코드에

: log4j 구성 파일에서

System.setProperty("file.name","your path"); 

:

log4j.appender.appender_name.File = ${file.name} 

다른 방법은 코드에 setFile(String fileName) 함수를 사용하여 런타임에서 파일 이름을 설정하는 것이다.

+0

감사합니다. :) – kyerie

+0

shamis를 말할 슬픈, junit 테스트를 사용하면 속성 파일이 작동하므로이 중 아무 것도 사용할 수 없습니다. 그러나 projectA에서 주요 방법을 만들면 Oded Peer가 자신의 게시물에 명시한 오류가 표시됩니다. – kyerie

0

클래스 패스 및 클래스 로더 문제라고 생각합니다. log4j 구성 파일은 프로젝트 A에 내장 된 jar 파일에 있습니다. 프로젝트 B는 log4j.jar 파일과 함께 classpath에 프로젝트 A의 jar 파일을 가지고 있습니다.

의 log4j : 메인 클래스는 log4j 구성 파일을 찾기 위해 자신의 메인 클래스의 클래스 로더를 사용하여 log4j 시스템을 초기화하려고 시도하지만 그것을 찾을 수없는 경우 , 따라서 당신은 오류가 같은 stderr로 인쇄받을한다 : WARN 로거 (TestServicePublisher)에 대한 appender를 찾을 수 없습니다.

log4j : 경고 log4j 시스템을 올바르게 초기화하십시오.

확인하려면 log4j.configuration 시스템 속성을 사용하여 구성 파일을 명시 적으로 설정하십시오.

+0

분명히 프로젝트 B의 기본 방법을 실행하려고 할 때 경고 메시지가 표시되지 않습니다. – kyerie

+0

나는 그런 식으로 보았지만 서비스를 시작하기 위해 projectB의 기본 메소드를 실행할 때마다 projectA의 로그 처리기이지만 여기서 지정한 오류는 제공하지 않습니다. – kyerie

+0

log4j 초기화를 디버그하려고 했습니까? _log4j.debug_ JVM 등록 정보를 _true_로 설정하여이를 수행 할 수 있습니다. –

관련 문제