2012-05-14 6 views
12

Weblogic12에서 sl4j/logback을 구성하려고합니다. 내가 WEB-INF \ 클래스를 가지고 전쟁 파일이 귀 파일, \ logback.xml
여기 를 배포하면 설정입니다 : sl4j/logback on weblogic

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
    <encoder> 
     <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
    </encoder> 
</appender> 

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

</configuration> 

내 코드는 로그인하기 :

private static final Logger logger = LoggerFactory.getLogger(FrontEndServlet.class); 
//...... 
logger.info("info test"); 
logger.debug("debug test"); 
logger.error("error test"); 

표준 출력에 표시되는 내용은 다음과 같습니다.

ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost 
INFO: info test 
ьрщ 14, 2012 5:09:29 PM .....FrontEndServlet doPost 
SEVERE: error test 

구성 파일이 선택되지 않은 것처럼 보입니다. 내가 뭘 잘못하고 있니?

답변

6

문제는 - sl4j가 로그백을 선택하지 않고 Weblogic의 slf4j-jdk 로깅을 대신 사용했습니다. 웹 로직의 설정 웹 로직-application.xml을, 옵션 선호-응용 프로그램 패키지

19

문제는 여기에 상세하게 설명되어 고정 수 있습니다 : https://stagingthinking.wordpress.com/2012/06/02/annoying-slf4j-problem-in-weblogic-server-12c/

당신이 둘 필요가 정확한 패키지 선호-응용 프로그램 패키지의 메커니즘과 같이 org.slf4j입니다 :

<?xml version='1.0' encoding='UTF-8'?> 
<weblogic-application> 
    <prefer-application-packages> 
    <package-name>org.slf4j</package-name> 
    </prefer-application-packages> 
</weblogic-application> 
6

참고 :이 질문에 대한 답변이 이미 있으 셨습니다. 그 항목에 prefer-application-resources도 추가해야합니다.

답변 :, 귀에 META-INF는/웹 로직-application.xml을라는 파일을 추가 prefer-application-packagesprefer-application-resources 모두 포함! 그냥 SLF4J보다 더 많은 문제가있는 경우

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application 
     xmlns="http://xmlns.oracle.com/weblogic/weblogic-application" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-application http://xmlns.oracle.com/weblogic/weblogic-application/1.5/weblogic-application.xsd" 
     version="6"> 

    <!-- http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm --> 
    <prefer-application-packages> 
     <package-name>org.slf4j.*</package-name> 
    </prefer-application-packages> 


    <!-- if not using prefer-application-resources you will get a warning like this: --> 
    <!-- Class path contains multiple SLF4J bindings --> 
    <!-- SLF4J: Found binding in [jar:file:/C:/wls1211/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] --> 
    <prefer-application-resources> 
     <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name> 
    </prefer-application-resources> 


</weblogic-application> 
+1

사용 방법 및 파일을 설명 할 때 매우 명확합니다. 고맙습니다! – ferreirabraga

0

대안 적으로 또는, 당신은

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

대신

<prefer-application-packages> 
    <package-name>org.slf4j.*</package-name> 
</prefer-application-packages> 

사용할 수 있습니다 출처 : Oracle

0

환경 : 웹 로직 12.2 .1 로깅 프레임 워크 : SLF4J 및 Logback 요구 사항 : 요구 사항을 만족하지 않았다 weblogic.xml의에서 <prefer-application-packages/> 또는 <prefer-web-inf-classes>를 사용하여 (응용 프로그램 당) 내 선택한 파일뿐만 아니라 웹 로직 서버 로그

에 로그인합니다. 내 테스트에서 하나 또는 다른 태그 (둘 다 사용할 수 없음)를 사용하면 응용 프로그램 logback.xml이 선택되고 logback.xml에 정의 된 파일로 로깅됩니다. 그러나 logback의 ConsoleAppender를 사용하는 일반적인 STDOUT 정의는 서버 로그에 기록하지 않습니다.

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 

다음을 weblogic에서 삭제합니다.xml

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
</wls:prefer-application-packages> 

은 Weblogic 12.2.1에 제공된 번들 SLF4j 바인딩을 Java Util 로깅으로 사용합니다. 이 경우 로그 문은 응용 프로그램 수준 logback.xml의 파일 정의가 아니라 서버 로그로 이동합니다. 내 연구에서는 Weblogic 12의 일부 버전이 내부 SLF4j를 Log4j에 바인딩 할 수 있도록 허용했지만 마이너 릴리스 중 하나에서 제거되었습니다. 이것은 나의 경우였다. 관리 콘솔을 통해 Log4j를 Weblogic의 기본 로깅 프레임 워크로 사용할 수있는 옵션이 없었습니다. 나는 이것이 나를 도와주지 않았을 것이라고 확신하지만, 내가 읽었던 여러 문서들이 이것을 사용할 수 있다고 지적했기 때문에 나는 그것을 메모하고 싶었다.

weblogic.xml, POM (제외 사항) 구성 및 다양한 바인딩과 브리지를 사용하여 많은 연구 조사를 해본 결과 필자는 원하는 로깅 구성을 달성하지 못했습니다. Weblogic의 slf4j는 더 좋든 나 나쁘 든간에 Java 유틸리티 로깅에 바인딩되어있는 것으로 보입니다. 자신의 slf4j 구현과 바인딩 (나의 경우 Logback)을 선택했다면, 설정을 통해 Weblogic 서버 로그로 그 메시지를 라우팅 할 수있는 방법이 없습니다. slf4j에는 하나의 바인딩 만있을 수 있지만 많은 프레임 워크가 해당 바인딩에 라우팅 될 수 있지만 (예 : this 다이어그램이 유용함) Weblogic 12.2.1은 Java 유틸리티 로깅 바인딩 만 사용하므로 애플리케이션 구성 수준)를 사용하여 Weblogic에 연결하여 서버 로그에 기록하기 위해 제공하는 Logback 바인딩을 사용합니다. 이 작업을 수행하기 위해 log4j와 브릿지를 사용할 수있는 방법이있을 수 있지만, 나에게는 너무 많은 팽창과 구성으로 인해 간단한 로깅 작업을 수행 할 수 있습니다.

구성에 의해이를 극복하려고 노력하면서 필자는 로깅 이벤트를 JUL 로깅 이벤트로 변환하는 자체 로그백 어 펜더를 작성하기로 결정했습니다. 많은 Logback 예제에서 보았던 표준 STDOUT 정의를 Logback AppenderBase의 own 구현으로 대체했습니다. 이제는 응용 프로그램 별 로깅 구성을 사용하여 로깅하고 Weblogic Server 로그에도 로깅 할 수 있습니다.

관련 POM 종속 관계 :

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.25</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core --> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 

weblogic.xml의

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/2.0/weblogic-web-app.xsd"> 
<jsp-descriptor> 
    <keepgenerated>true</keepgenerated> 
    <debug>true</debug> 
</jsp-descriptor> 
<context-root>YourContextRoot</context-root> 
<wls:container-descriptor> 
    <wls:prefer-application-packages> 
     <wls:package-name>ch.qos.logback.*</wls:package-name> 
     <wls:package-name>org.jboss.logging.*</wls:package-name> 
     <wls:package-name>org.slf4j.*</wls:package-name> 
    </wls:prefer-application-packages> 
    <wls:prefer-application-resources> 
     <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name> 
    </wls:prefer-application-resources> 
</wls:container-descriptor> 

Logback AppenderBase 구현

을 (최대 절전 모드가 자동으로 SLF4J을 해소 할 JbossLogging와 함께 제공 여기 참고)
import java.util.logging.Logger; 

import ch.qos.logback.classic.spi.ILoggingEvent; 
import ch.qos.logback.core.AppenderBase; 

public class WeblogicAppender extends AppenderBase<ILoggingEvent> { 

private final Logger logger = Logger.getLogger(WeblogicAppender.class.getName()); 
ILoggingEvent event = null; 

@Override 
protected void append(ILoggingEvent event) { 
    this.event = event; 
    logger.log(getJULLevel(), event.getFormattedMessage()); 
} 

private java.util.logging.Level getJULLevel() { 

    if (this.event == null) { 
     return java.util.logging.Level.SEVERE; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.ALL) { 
     return java.util.logging.Level.ALL; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.DEBUG) { 
     return java.util.logging.Level.FINE; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.ERROR) { 
     return java.util.logging.Level.SEVERE; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.INFO) { 
     return java.util.logging.Level.INFO; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.TRACE) { 
     return java.util.logging.Level.FINEST; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.WARN) { 
     return java.util.logging.Level.WARNING; 
    } else if (this.event.getLevel() == ch.qos.logback.classic.Level.OFF) { 
     return java.util.logging.Level.OFF; 
    } else { 
     return java.util.logging.Level.INFO; 
    } 
} 

}

Logback.xml 구성

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
<appender name="STDOUT" class="com.your.package.WeblogicAppender"> 
    <encoder> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern> 
    </encoder> 
</appender> 
<appender name="FILE" 
    class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>yourlog.log 
    </file> 
    <rollingPolicy 
     class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 
     <fileNamePattern>yourlog.%d{yyyy-MM-dd}.%i.log 
     </fileNamePattern> 
     <maxFileSize>25MB</maxFileSize> 
     <maxHistory>60</maxHistory> 
     <totalSizeCap>10GB</totalSizeCap> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger: LineNumber:%L - %message%n</pattern> 
    </encoder> 
</appender> 

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

는 다행스럽게도 필자는 다른 사람에게 내가 원하는이 작동하는 방식을 얻으려고 노력 겪었 고통의 일부를 절약 할 수 있습니다.