2016-06-09 3 views
2

Logback을 사용하는 Maven에서 테스트 webapp를 만들었습니다. 내가 mvn test이 모든 것이 잘 작동 실행하면logback.xml 파일이로드되지 않습니다.

<configuration scan="true"> 

    <!-- For more information: http://logback.qos.ch/manual/configuration.html --> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <!-- encoders are assigned the type 
     ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>D:/Oracle/user_projects/domains/base_domain/servers/AdminServer/logs/myapp.log</file> 

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- daily rollover --> 
     <fileNamePattern>D:/Oracle/user_projects/domains/base_domain/servers/AdminServer/logs/archive/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> 

     <!-- keep 31 days' worth of history --> 
     <maxHistory>31</maxHistory> 
    </rollingPolicy> 

    <encoder> 
     <pattern>%date [%level] [%thread] [%file:%line] %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="debug"> 
    <appender-ref ref="FILE" /> 
    <appender-ref ref="STDOUT" /> 
    </root> 

</configuration> 

내가 모두 src/main/resourcessrc/test/resources

이 파일을 복사 한 다음은 내 logback.xml 구성 파일입니다. 테스트 로그 메시지가 콘솔뿐만 아니라 myapp.log 파일 모두에 기록됩니다 그 후

public class TestLogService extends TestCase { 

    public TestLogService(String name) { 
     super(name); 
    } 

    public void testLogMessage() throws Exception { 
     LogService.debug("Hello from {}!", "TestLogService"); 
    } 

} 

, 내가 mvn install을 실행하고 (WEB-INF/classes에서 logback.xml이있는) 결과 war 파일을 배포 내 로컬 WebLogic 서버. 출력은, 아무 일도 발생하지 다음이 "/ myapp와가에 봉사"옆에서,

public class TestServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    public TestServlet() { 
     // TODO Auto-generated constructor stub 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     LogService.debug("Hello from {}!", "doGet()"); 
     response.getWriter().append("Served at: ").append(request.getContextPath()); 
    } 
} 

그러나 :이 작업이 일단, 난 그냥 로그 파일에 하나의 문을 로그하도록되어 테스트 서블릿을 맞았다! 아무것도 로그 파일이나 콘솔에 기록되지 않습니다. 콘솔에 오류 메시지가 표시되지 않습니다. 로그백이 자동으로 실패하는 것처럼 보입니다.

그리고 LogService 클래스는 logback 통화 단지 래퍼입니다 :

public class LogService { 

    private static Logger logger = LoggerFactory.getLogger("com.myapp"); 

    public static void debug(String message) { 
     logger.debug(message); 
    } 

    public static void debug(String message, Object... argArray) { 
     logger.debug(message, argArray); 
    } 
} 

내가 내 자바 logback.configurationFile 속성을 설정하려고 여기 (Setting logback.xml path programmatically) 설명뿐만 아니라 프로그래밍 방식으로 설정 옵션을 시작합니다.

두 방법 모두 정확히 같은 결과가 나타납니다. mvn test은 메시지를 잘 기록하지만 localhost에서 테스트 서블릿을 실행할 때 아무런 반응이 없습니다.

어떤 문제가 될 수 있습니까?

System.out.println("[LogService.debug] isDebugEnabled = " + logger.isDebugEnabled()); 
System.out.println("[LogService.debug] getName = " + logger.getName()); 
System.out.println("[LogService.debug] ROOT_LOGGER_NAME = " + Logger.ROOT_LOGGER_NAME); 
System.out.println("[LogService.debug] toString = " + logger.toString()); 

그리고 지금 mvn test과 TestServlet 다른 출력을 제공 타격 :

mvn test says:          TestServlet says: 
-----------------------------------------------  ----------------------------------------------- 
[LogService.debug] isDebugEnabled = true   [LogService.debug] isDebugEnabled = false 
[LogService.debug] getName = com.myapp    [LogService.debug] getName = com.myapp 
[LogService.debug] ROOT_LOGGER_NAME = ROOT   [LogService.debug] ROOT_LOGGER_NAME = ROOT 
[LogService.debug] toString = Logger[com.myapp]  [LogService.debug] toString = org.slf4j.impl.JDK14LoggerAdapter(com.myapp) 

그래서 적어도 설명 내가 LogService 일부 디버그 문을 추가

추가 정보 왜 TestServlet에서 디버그 로그 문을 볼 수 없습니다. 이제 그 이유를 알아 내야 만합니다.

+0

문제를 해결하려면''를 사용하여 디버그 출력을 활성화하십시오. 또는, 시스템 속성'-Dlogback.debug = true'를 사용하여 디버그를 활성화하십시오. – tony19

+0

@ tony19 감사합니다. 디버그 출력을 활성화하고 mvn 테스트로 디버그 출력을 보았습니다. 하지만 서블릿을 치면 나에게 침묵의 치료를 계속합니다. 나는 그 문제가 믿을 수 없을 정도로 간단하고 분명히 내가 완전히 빠져 나갔다고 생각하기 시작했다. – Aaron

+0

SLF4J에서 로그백 로깅 구현을 선택하지 않은 것 같습니다. logback.jar이 web-app/lib에 있는지 확인하고 slf4j-jdk14 로깅과 같은 다른 로깅 구현이 없는지 확인하십시오. –

답변

5

WebLogic에서 기본 SLF4J 구현을 재정의해야하는 것처럼 들립니다. 이렇게하려면 weblogic.xml의 파일에 다음 코드를 추가

<wls:container-descriptor> 
     <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes> 
</wls:container-descriptor> 

이것은 당신이 당신의 다른 필요 logback libs와 함께 제공되는 SLF4J 구현의 우선 순위를합니다. 구성 파일 위치에 관해서

, 당신은 뭔가를 검색해야하는 도메인 루트에 logback.xml 파일을 넣을거야 : "../user_projects/domains/$domain_name"을 .

이 정보가 도움이되기를 바랍니다.

+0

이것은 효과가 있습니다. 고맙습니다! – Aaron

관련 문제