2012-05-14 9 views
12

Ich versuche, sl4j/logback unter Weblogic12 zu konfigurieren. I Ohr-Datei bereitstellen, die WAR-Datei hat, die WEB-INF \ classes hat \ logback.xml
Hier ist die config: sl4j/logback unter 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> 

Mein Code zu protokollieren:

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

Was ich in der Standart-Ausgabe sehe ist:

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

So sieht es aus wie Konfig-Datei nicht abgeholt wird. Was mache ich falsch?

Antwort

6

Das Problem war - sl4j Logbuch nicht abgeholt und verwendet Weblogic slf4j-jdk Protokollierung statt. Kann mit Weblogic config weblogic-application.xml, Option bevorzugen-application-Paketen behoben werden

6

Hinweis: Auch diese Frage ist bereits beantwortet, ich möchte hinzufügen, dass Sie auch prefer-application-resources hinzufügen sollten.

Antwort: eine Datei hinzufügen META-INF/weblogic-application.xml an Ihr Ohr genannt, beide prefer-application-packages und prefer-application-resources enthalten!

<?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

Es ist sehr klar, wenn Sie erklären, wie und welche Datei verwendet werden muss. Vielen Dank! – ferreirabraga

0

Alternativ oder wenn Sie Probleme mit mehr als nur slf4j haben, könnten Sie

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

verwenden statt

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

Quelle: Oracle

0

Umwelt: Weblogic 12.2 .1 Protokollierung Framework: SLF4J und Logback Voraussetzung: Melden Sie sich in eine Datei meiner Wahl (pro Anwendung) sowie Weblogic Server-Logs

die <prefer-application-packages/> oder <prefer-web-inf-classes> in weblogic.xml Verwendung nicht die Anforderung erfüllen. In meinen Tests führt die Verwendung des einen oder anderen Tags (Sie können beide nicht verwenden) dazu, dass die Anwendung logback.xml aufgerufen wird und die Protokollierung in die in logback.xml definierte Datei wechselt. Die typische STDOUT-Definition, die ConsoleAppender von Logback verwendet, wird jedoch nicht in den Serverprotokollen protokolliert.

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

Entfernen Sie die folgenden von Weblogic.xml

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

führt das gebündelte SLF4J sich mit der Bindung, die in Weblogic 12.2.1, Java Util Logging ist. In diesem Fall werden Protokollanweisungen an die Serverprotokolle und nicht an die Dateidefinition in der Anwendungsebene logback.xml gesendet. In meinen Nachforschungen scheint es zu einer Zeit zu sein, dass einige Versionen von Weblogic 12 es erlaubten, das interne SLF4j an Log4j zu binden, wurde aber in einem der kleineren Releases entfernt. Das war mein Fall; Ich hatte nicht die Möglichkeit, Log4j als primäres Logging-Framework in Weblogic über die Admin-Konsole zu aktivieren. Ich bin mir ziemlich sicher, dass mir das nicht geholfen hätte, aber ich wollte es notieren, weil mehrere Dokumente, die ich gelesen habe, darauf hinweisen, dass dies verfügbar wäre.

Nach viel Forschung und Bekämpfung Konfiguration mit weblogic.xml, Konfiguration von POM (Ausschlüsse usw.) und versuchen, verschiedene Bindungen und Brücken zu verwenden, konnte ich nicht erreichen, die Protokollierungskonfiguration, die ich wollte. Es scheint, dass Sllf4j von Weblogic an die Protokollierung von Java-Utilities gebunden ist, ob nun besser oder schlechter. Wenn Sie Ihre eigene Implementierung von slf4j und binding (in meinem Fall Logback) wählen, gibt es keine Möglichkeit, diese Nachrichten über die Konfiguration an Weblogic-Serverprotokolle weiterzuleiten. Es kann nur eine Bindung in slf4j geben, und obwohl viele Frameworks zu dieser einen Bindung geroutet werden können (Ich fand this Diagramm nützlich) Weblogic 12.2.1 verwendet nur Java-Util-Logging-Bindung, gibt es keine Möglichkeit (auf der Anwendungskonfigurationsebene) um Weblogic so zu verkabeln, dass die Logback-Bindung verwendet wird, die Sie für die Protokollierung der Serverprotokolle bereitstellen. Es könnte eine Möglichkeit geben, log4j und Bridges zu verwenden, um dies zu erreichen, aber für mich ist das zu viel Aufblähung und Konfiguration, um eine einfache Protokollierungsaufgabe zu erledigen.

Nachdem ich aufgegeben habe, dies durch Konfiguration zu erobern, habe ich beschlossen, einfach meinen eigenen Logback-Appender zu schreiben, der ein Logging-Ereignis in ein JUL-Logging-Ereignis übersetzt. Ich habe die standardmäßige STDOUT-Definition, die in vielen Logback-Beispielen zu sehen ist, durch meine own Implementierung von Logbacks AppenderBase ersetzt. An dieser Stelle kann ich jetzt mit der Konfiguration der Anwendungsprotokollierung und der Protokollierung im Weblogic Server-Protokoll protokollieren. Abhängigkeiten

Relevante 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 (Man beachte hier, dass Hibernate mit JbossLogging kommt, die automatisch SLF4J überbrückt)

<?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 Implementierung

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 Konfiguration

<?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> 

Hoffentlich kann ich andere einige der Schmerzen speichern, die ich durch den Versuch ging diese Arbeit den Weg zu bekommen ich wollte.